3760 votes

Java: itérer HashMap

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?

5372voto

harto Points 28479

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).

3451voto

karim79 Points 178055

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

873voto

arvind Points 2349

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.

107voto

codethulhu Points 1678

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

76voto

jkarretero Points 363

De manière plus intelligente:

for (String key : hashMap.keySet()) {
    System.out.println("Key: " + key + ", Value: " + map.get(key));
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X