Как для каждого hashmap? [дубликат]
этот вопрос уже есть ответ здесь:
у меня есть это поле:
HashMap<String, HashMap> selects = new HashMap<String, HashMap>();
для каждого Hash<String, HashMap> мне нужно создать ComboBox, чьи элементы являются значением (которое само по себе является хэш-картой) HashMap <String, **HashMap**>.
посредством (нефункционирующей) демонстрации:
for (int i=0; i < selects.size(); i++) {
HashMap h = selects[i].getValue();
ComboBox cb = new ComboBox();
for (int y=0; y < h.size(); i++) {
cb.items.add(h[y].getValue);
}
}
7 ответов:
Я знаю, что немного опоздал на это, но я тоже поделюсь тем, что сделал, если это поможет кому-то еще :
HashMap<String, HashMap> selects = new HashMap<String, HashMap>(); for(Map.Entry<String, HashMap> entry : selects.entrySet()) { String key = entry.getKey(); HashMap value = entry.getValue(); // do what you have to do here // In your case, another loop. }
лямда - Выражение Java 8
в Java 1.8 (Джава 8) это стало намного проще с помощью forEach метод из агрегатных операций (поток операций) это похоже на итераторы из Iterable интерфейс.
просто скопируйте вставить ниже заявление в свой код и переименовать HashMap переменной от хм для вашей переменной HashMap, чтобы распечатать ключ-значение пара.
HashMap<Integer,Integer> hm = new HashMap<Integer, Integer>(); /* * Logic to put the Key,Value pair in your HashMap hm */ // Print the key value pair in one line. hm.forEach((k,v) -> System.out.println("key: "+k+" value:"+v));вот пример, где a Лямбда-Выражение используется:
HashMap<Integer,Integer> hm = new HashMap<Integer, Integer>(); Random rand = new Random(47); int i=0; while(i<5){ i++; int key = rand.nextInt(20); int value = rand.nextInt(50); System.out.println("Inserting key: "+key+" Value: "+value); Integer imap =hm.put(key,value); if( imap == null){ System.out.println("Inserted"); } else{ System.out.println("Replaced with "+imap); } } hm.forEach((k,v) -> System.out.println("key: "+k+" value:"+v)); Output: Inserting key: 18 Value: 5 Inserted Inserting key: 13 Value: 11 Inserted Inserting key: 1 Value: 29 Inserted Inserting key: 8 Value: 0 Inserted Inserting key: 2 Value: 7 Inserted key: 1 value:29 key: 18 value:5 key: 2 value:7 key: 8 value:0 key: 13 value:11также можно использовать Spliterator то же самое.
Spliterator sit = hm.entrySet().spliterator();обновление
включая ссылки на документацию к документам Oracle. Для получения дополнительной информации лямда - на этот ссылке и должны читать Совокупность Операций и последний перейти к этому ссылке.
Map.values():HashMap<String, HashMap<SomeInnerKeyType, String>> selects = new HashMap<String, HashMap<SomeInnerKeyType, String>>(); ... for(HashMap<SomeInnerKeyType, String> h : selects.values()) { ComboBox cb = new ComboBox(); for(String s : h.values()) { cb.items.add(s); } }
Вы можете перебрать
HashMap(и многие другие коллекции) с помощью итератора, например:HashMap<T,U> map = new HashMap<T,U>(); ... Iterator it = map.values().iterator(); while (it.hasNext()) { System.out.println(it.next()); }
Я обычно делаю то же самое, что и cx42net, но я явно не создаю запись.
HashMap<String, HashMap> selects = new HashMap<String, HashMap>(); for (String key : selects.keySet()) { HashMap<innerKey, String> boxHolder = selects.get(key); ComboBox cb = new ComboBox(); for (InnerKey innerKey : boxHolder.keySet()) { cb.items.add(boxHolder.get(innerKey)); } }Это просто кажется мне самым интуитивным, я думаю, что я предвзято отношусь к повторению значений карты.
как уже упоминалось, в Java 8 мы получили
forEachметод, который принимает лямбда-выражение. Но у нас тоже есть поток API-интерфейсы.перебирать записи (используя forEach и Streams):
sample.forEach((k,v) -> System.out.println(k + "=" + v)); sample.entrySet().stream().forEachOrdered((entry) -> { Object currentKey = entry.getKey(); Object currentValue = entry.getValue(); System.out.println(currentKey + "=" + currentValue); }); sample.entrySet().parallelStream().forEach((entry) -> { Object currentKey = entry.getKey(); Object currentValue = entry.getValue(); System.out.println(currentKey + "=" + currentValue); });преимущество потоков в том, что они могут быть легко распараллелены и могут быть полезны, когда у нас есть несколько процессоров в распоряжении. Нам просто нужно использовать
parallelStream()на местеstream()выше. С параллельными потоками это имеет больше смысла использоватьforEachкакforEachOrderedне будет иметь никакого значения в производительности. Если мы хотим перебирать ключи, мы можем использоватьsample.keySet()и для значенийsample.values().почему
forEachOrdered, а неforEachс потоками ?потоки также обеспечивают
forEachметод, но поведениеforEachявно недетерминирован, где какforEachOrderedвыполнить действие для каждого элемента этого потока, в порядок встречи потока если поток имеет определенный порядок встреч. Так чтоforEachне гарантирует, что заказ будет храниться. Также проверьте этой дополнительные.
Comments