Itérer à travers un HashMap [dupliquer]


Duplicata Possible:
Comment itérer efficacement sur chaque entrée dans une "carte"?

Quelle est la meilleure façon d'itérer sur les éléments dans un HashMap?

Author: Peter Mortensen, 2009-07-01

7 answers

Itérer sur les entrySet() comme ceci:

public static void printMap(Map mp) {
    Iterator it = mp.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pair = (Map.Entry)it.next();
        System.out.println(pair.getKey() + " = " + pair.getValue());
        it.remove(); // avoids a ConcurrentModificationException
    }
}

Lire plus sur Map.

 2884
Author: karim79, 2018-04-20 16:56:35

Si vous n'êtes intéressé que par les clés, vous pouvez parcourir le keySet() de la carte:

Map<String, Object> map = ...;

for (String key : map.keySet()) {
    // ...
}

Si vous n'avez besoin que des valeurs, utilisez values():

for (Object value : map.values()) {
    // ...
}

Enfin, si vous souhaitez à la fois la clé et la valeur, l'utilisation 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 à mi-itération, vous devrez le faire via un Itérateur (voirréponse de karim79 ). Cependant, la modification des valeurs d'élément est OK (voir Map.Entry).

 4194
Author: harto, 2017-05-23 12:34:51

Extrait de la référence Comment itérer sur une Carte en Java:

Il existe plusieurs façons d'itérer sur un Map en Java. Voici les méthodes les plus courantes et d'examiner leurs avantages et inconvénients. Étant donné que toutes les cartes en Java implémentent l'interface de carte, les techniques suivantes fonctionneront pour toute implémentation de carte(HashMap, TreeMap, LinkedHashMap, Hashtable, etc.)

Méthode # 1: Itérer sur les entrées en utilisant un For-Each boucle.

C'est la méthode la plus courante et est préférable dans la plupart des cas. Il doit être utilisé si vous avez besoin à la fois de clés de carte et de 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 la boucle For-Each a été introduite dans Java 5, donc cette méthode ne fonctionne que dans les versions plus récentes du langage. De plus, une boucle For-Each lancera NullPointerException si vous essayez d'itérer sur une carte qui est nulle, donc avant d'itérer, vous devriez toujours vérifier les références null.

Méthode #2: Itération sur les touches ou des valeurs utilisant une boucle For-Each.

Si vous n'avez besoin que de clés ou de valeurs de la carte, vous pouvez itérer sur le jeu de clés ou les valeurs au lieu du jeu d'entrées.

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 de performance par rapport à l'itération entrySet (environ 10% plus rapide) et est plus propre.

Méthode # 3: Itération à l'aide de l'itérateur.

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 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 itérer sur keySet ou valeur.

Cette méthode peut sembler redondante, mais elle a ses propres avantages. Tout d'abord, c'est le seul moyen d'itérer sur une carte dans les anciennes versions de Java. L'autre caractéristique importante est que c'est la seule méthode qui vous permet de supprimer des entrées de la carte pendant l'itération en appelant iterator.remove(). Si vous essayez de le faire pendant For-Chaque itération, vous obtiendrez des " résultats imprévisibles "selonJavadoc .

Du point de vue des performances, cette méthode est égale à Pour Chaque itération.

Méthode # 4: Itération sur les clés et 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 pourrait ressembler à une alternative plus propre pour la méthode #1, mais en pratique, il est assez lent et inefficace car obtenir des valeurs par une clé peut prendre du temps (cette méthode dans différentes implémentations de carte est 20% -200% plus lente que la méthode #1). Si vous avez FindBugs installé, il détectera cela et vous avertira de l'itération inefficace. Cette méthode devrait être éviter.

Conclusion:

Si vous n'avez besoin que de clés ou de valeurs de la carte, utilisez la méthode #2. Si vous êtes bloqué avec une ancienne version de Java (inférieure à 5) ou si vous prévoyez de supprimer des entrées pendant l'itération, vous devez utiliser la méthode #3. Sinon, utilisez la méthode #1.

 751
Author: arvind, 2016-07-06 19:33:03
for (Map.Entry<String, String> item : params.entrySet()) {
    String key = item.getKey();
    String value = item.getValue();
}
 84
Author: gabor, 2018-04-20 16:52:35

, Vous pouvez parcourir les entrées dans un Map de plusieurs façons. Obtenez chaque clé et 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 obtenir toutes les valeurs et que vous n'êtes pas concerné par les clés, vous pouvez utiliser:

Collection<?> values = map.values();
 82
Author: codethulhu, 2018-04-20 16:52:15

Plus Intelligent:

for (String key : hashMap.keySet()) {
    System.out.println("Key: " + key + ", Value: " + map.get(key));
}
 57
Author: jkarretero, 2010-08-11 10:01:04

Dépend. Si vous savez que vous aurez besoin à la fois de la clé et de la valeur de chaque entrée, passez par le entrySet. Si vous avez juste besoin des valeurs, il y a la méthode values(). Et si vous avez juste besoin des clés, utilisez keyset().

Une mauvaise pratique serait d'itérer à travers toutes les clés, puis dans la boucle, toujours faire map.get(key) pour obtenir la valeur. Si vous faites cela, alors la première option que j'ai écrite est pour vous.

 42
Author: Gary Kephart, 2013-09-27 17:42:25