Comment pour chacun le hashmap?

J’ai ce champ:

HashMap selects = new HashMap(); 

Pour chaque Hash je dois créer un ComboBox dont les éléments sont la valeur (qui se trouve être une HashMap elle-même) de HashMap .

En guise de démonstration (non fonctionnelle):

 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); } } 

Je sais que je suis un peu en retard pour celui-là, mais je vais partager ce que j’ai fait, au cas où cela aiderait quelqu’un d’autre:

 HashMap selects = new HashMap(); for(Map.Entry entry : selects.entrySet()) { Ssortingng key = entry.getKey(); HashMap value = entry.getValue(); // do what you have to do here // In your case, another loop. } 

Expression Lambda Java 8

Dans Java 1.8 (Java 8), cela est devenu beaucoup plus facile en utilisant la méthode forEach des opérations Aggregate ( opérations Stream ) qui ressemble aux iterators de Iterable Interface.

Copiez simplement le collage ci-dessous dans votre code et renommez la variable HashMap de hm à votre variable HashMap pour imprimer une paire clé-valeur.

 HashMap hm = new HashMap(); /* * 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)); 

Voici un exemple où une expression Lambda est utilisée:

  HashMap hm = new HashMap(); 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 

On peut aussi utiliser Spliterator pour le même.

 Spliterator sit = hm.entrySet().spliterator(); 

METTRE À JOUR


Y compris des liens de documentation vers Oracle Docs. Pour plus d’informations sur Lambda, accédez à ce lien et lisez les opérations d’agrégat et de spliterator pour accéder à ce lien .

Map.values() :

 HashMap> selects = new HashMap>(); ... for(HashMap h : selects.values()) { ComboBox cb = new ComboBox(); for(Ssortingng s : h.values()) { cb.items.add(s); } } 

Vous pouvez parcourir une HashMap (et de nombreuses autres collections) en utilisant un iterator, par exemple:

 HashMap map = new HashMap(); ... Iterator it = map.values().iterator(); while (it.hasNext()) { System.out.println(it.next()); } 

Je fais généralement la même chose que cx42net, mais je ne crée pas explicitement une entrée.

 HashMap selects = new HashMap(); for (Ssortingng key : selects.keySet()) { HashMap boxHolder = selects.get(key); ComboBox cb = new ComboBox(); for (InnerKey innerKey : boxHolder.keySet()) { cb.items.add(boxHolder.get(innerKey)); } } 

Cela me semble le plus intuitif, je pense que je suis contre les itérations sur les valeurs d’une carte.

Comme déjà mentionné, dans Java 8, nous avons la méthode forEach qui accepte une expression lambda . Mais nous avons également des API de stream .

Itérer sur les entrées (Utilisation de forEach et 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); }); 

L’avantage des stream est qu’ils peuvent être facilement parallélisés et peuvent être utiles lorsque plusieurs processeurs sont disponibles. Nous devons simplement utiliser parallelStream() à la place de stream() ci-dessus. Avec les stream parallèles, il est plus judicieux d’utiliser forEach comme forEachOrdered ne ferait aucune différence dans les performances. Si nous voulons itérer sur les clés, nous pouvons utiliser sample.keySet() et pour les valeurs sample.values() .

Pourquoi forEachOrdered et pas pour forEach stream?

Les stream fournissent également la méthode forEach mais le comportement de forEach est explicitement non déterministe lorsque forEachOrdered exécute une action pour chaque élément de ce stream, dans l’ ordre de rencontre du stream si le stream a un ordre de rencontre défini. So forEach ne garantit pas que la commande sera conservée. Vérifiez également cela pour plus.