Double Possible:
Comment puis-je effectuer une itération sur chaque Entrée dans une Collection de Carte?Quel est le meilleur moyen de parcourir un
HashMap
?
Réponses
Trop de publicités?Si vous êtes seulement intéressés par les touches, vous pouvez parcourir l' keySet()
de la carte:
Map<String, Object> map = ...;
for (String key : map.keySet()) {
// ...
}
Si vous avez seulement besoin de les valeurs, utilisez values()
:
for (Object value : map.values()) {
// ...
}
Enfin, si vous souhaitez à la fois la clé et la valeur, utilisez entrySet()
:
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
// ...
}
Une mise en garde: si vous souhaitez supprimer des éléments de la mi-itération, vous aurez besoin de le faire via un Itérateur (voir karim79 de réponse). Toutefois, l'évolution des valeurs des éléments est OK (voir Map.Entry
).
Parcourir l' entrySet
comme:
public static void printMap(Map mp) {
Iterator it = mp.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pairs = (Map.Entry)it.next();
System.out.println(pairs.getKey() + " = " + pairs.getValue());
it.remove(); // avoids a ConcurrentModificationException
}
}
Lire plus sur Map
Extrait de lien de Référence: Comment Itérer Sur une Carte en Java
Il y a plusieurs façons de parcourir un Map
en Java. Permet de passer en revue les méthodes les plus courantes et d'examiner leurs avantages et inconvénients. Depuis toutes les cartes en Java mettre en œuvre la Carte d'interface, à la suite de techniques de travail pour n'importe quelle carte de mise en œuvre (HashMap
, TreeMap
, LinkedHashMap
, Hashtable
, etc.)
Méthode #1: l'Itération sur les entrées à l'aide de boucle For-each.
C'est la méthode la plus commune et est préférable dans la plupart des cas. Doit être utilisé si vous avez besoin de la carte des clés et des valeurs dans la boucle.
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
Notez que Pour Chaque boucle a été introduit dans Java 5, de sorte que cette méthode fonctionne seulement dans les nouvelles versions de la langue. Aussi Pour Chaque boucle se jeter NullPointerException
si vous essayez d'effectuer une itération sur une carte qui est null, avant de l'itération, vous devriez toujours vérifier les références nulles.
Méthode #2: parcourir des clés ou des valeurs à l'aide de boucle For-each.
Si vous avez besoin des clés ou des valeurs à partir de la carte, vous pouvez effectuer une itération sur jeu de clés ou valeurs au lieu de entrySet.
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
//iterating over keys only
for (Integer key : map.keySet()) {
System.out.println("Key = " + key);
}
//iterating over values only
for (Integer value : map.values()) {
System.out.println("Value = " + value);
}
Cette méthode donne un léger avantage en termes de performance sur entrySet
itération (environ 10% plus rapide) et est plus propre.
Méthode n ° 3: l'Itération à l'aide d'Itérateur.
L'Utilisation De Génériques:
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<Integer, Integer> entry = entries.next();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
Sans Les Génériques:
Map map = new HashMap();
Iterator entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = (Map.Entry) entries.next();
Integer key = (Integer)entry.getKey();
Integer value = (Integer)entry.getValue();
System.out.println("Key = " + key + ", Value = " + value);
}
Vous pouvez également utiliser la même technique pour parcourir keySet
ou de valeurs.
Cette méthode peut paraître redondant, mais il a ses propres avantages. Tout d'abord c'est le seul moyen pour effectuer une itération sur une carte, dans les anciennes versions de Java. L'autre caractéristique importante est que c'est la seule méthode qui permet de supprimer des entrées de la carte au cours d'une itération en appelant itérateur.supprimer(). Si vous essayez de le faire au cours De Chaque itération, vous obtiendrez des "conséquences imprévisibles", selon la javadoc.
Du point de vue des performances de cette méthode est égal Pour Chaque itération.
Méthode n ° 4: Itération sur les touches et la recherche de valeurs (inefficace).
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Integer key : map.keySet()) {
Integer value = map.get(key);
System.out.println("Key = " + key + ", Value = " + value);
}
Cela peut paraître comme une alternative plus propre pour la méthode n ° 1, mais dans la pratique, il est assez lent et inefficace, comme l'obtention de valeurs d'une clé peut être une perte de temps (cette méthode dans des cartes différentes implémentations est de 20%-200% plus lente que la méthode #1). Si vous avez FindBugs installé, il va le détecter et de vous avertir inefficace itération. Cette méthode doit être évitée.
Conclusion
Si vous avez besoin des clés ou des valeurs à partir de la carte, utiliser la méthode #2. Si vous êtes coincé avec les anciennes version de Java (moins de 5) ou de la planification pour supprimer des entrées au cours d'une itération, vous devez utiliser la méthode #3. Sinon, utilisez la méthode #1.
Vous pouvez parcourir les entrées d'une Carte de plusieurs façons. L'obtention de chaque clé et la valeur comme ceci:
Map<?,?> map = new HashMap<Object, Object>();
for(Entry<?, ?> e: map.entrySet()){
System.out.println("Key " + e.getKey());
System.out.println("Value " + e.getValue());
}
Ou vous pouvez obtenir la liste des clés avec
Collection<?> keys = map.keySet();
for(Object key: keys){
System.out.println("Key " + key);
System.out.println("Value " + map.get(key));
}
Si vous voulez juste pour obtenir toutes les valeurs, et ne sont pas concernés avec les touches, vous pouvez utiliser:
Collection<?> values = map.values();