Как для каждого 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);
}
}
352   7  

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 не гарантирует, что заказ будет храниться. Также проверьте этой дополнительные.

использовать entrySet см. пример здесь:

Comments

    Ничего не найдено.