J'ai ce champ:
HashMap<String, HashMap> selects = new HashMap<String, HashMap>();
Pour chaque Hash<String, HashMap>
j'ai besoin de créer un ComboBox
, dont les éléments sont la valeur (qui se trouve être une table de hachage elle-même) de HashMap <String, **HashMap**>
.
À titre 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 aussi, au cas où cela aiderait quelqu'un d'autre:
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.
}
Lambda Expression 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 de flux ) similaires aux itérateurs de Iterable Interface.
Il suffit de copier-coller l’instruction ci-dessous dans votre code et de renommer la variable HashMap de hm à votre variable HashMap pour imprimer la paire clé-valeur.
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));
Voici un exemple d'utilisation d'une expression Lambda :
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
Aussi on peut utiliser Spliterator pour le même.
Spliterator sit = hm.entrySet().spliterator();
UPDATE
Y compris les liens vers la documentation Oracle Docs. Pour plus sur Lambda , allez à this lien et devez lire Opérations d'agrégat et pour Spliterator, allez à ceci lien .
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);
}
}
Vous pouvez effectuer une itération sur une HashMap
(et de nombreuses autres collections) à l'aide d'un itérateur, par exemple:
HashMap<T,U> map = new HashMap<T,U>();
...
Iterator it = map.values().iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
Avec la méthode forEach
qui accepte une expression lambda , nous avons également flux API, dans Java 8.
Itérer sur les entrées (Utilisation de forEach et de 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 flux est qu’ils peuvent être facilement parallélisés et peuvent être utiles lorsque nous disposons de plusieurs processeurs. Nous devons simplement utiliser parallelStream()
à la place de stream()
ci-dessus. Avec les flux parallèles, il est plus logique d'utiliser forEach
, car forEachOrdered
ne ferait aucune différence en termes de performances. Si nous voulons parcourir les touches, nous pouvons utiliser sample.keySet()
et pour les valeurs sample.values()
.
Pourquoi forEachOrdered
et non forEach
avec des flux?
Les flux fournissent également la méthode forEach
mais le comportement de forEach
est explicitement non déterministe, où, comme le forEachOrdered
exécute une action pour chaque élément de ce flux, dans ordre de rencontre du flux si le flux a un ordre de rencontre défini. Donc, forEach
ne garantit pas que la commande sera conservée. Vérifiez également this pour plus.
Je fais généralement la même chose que cx42net, mais je ne crée pas explicitement d'entrée.
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));
}
}
Cela me semble le plus intuitif, je pense que je suis prévenu contre les itérations sur les valeurs d’une carte.
Utilisez entrySet
,
/**
*Output:
D: 99.22
A: 3434.34
C: 1378.0
B: 123.22
E: -19.08
B's new balance: 1123.22
*/
import Java.util.HashMap;
import Java.util.Map;
import Java.util.Set;
public class MainClass {
public static void main(String args[]) {
HashMap<String, Double> hm = new HashMap<String, Double>();
hm.put("A", new Double(3434.34));
hm.put("B", new Double(123.22));
hm.put("C", new Double(1378.00));
hm.put("D", new Double(99.22));
hm.put("E", new Double(-19.08));
Set<Map.Entry<String, Double>> set = hm.entrySet();
for (Map.Entry<String, Double> me : set) {
System.out.print(me.getKey() + ": ");
System.out.println(me.getValue());
}
System.out.println();
double balance = hm.get("B");
hm.put("B", balance + 1000);
System.out.println("B's new balance: " + hm.get("B"));
}
}
voir exemple complet ici: