Question Itérer à travers une HashMap [dupliquer]


Dupliquer possible: 
Comment parcourir efficacement chaque entrée dans une 'Carte'?

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


2827
2018-06-30 23:24


origine


Réponses:


Itérer à travers le entrySet() ainsi:

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

En savoir plus sur Map.


2835
2018-06-30 23:27



Si vous êtes uniquement intéressé par les touches, vous pouvez parcourir le keySet() de la carte:

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

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

Si vous avez seulement besoin des valeurs, utilisez values():

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

Enfin, si vous voulez à 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 voulez supprimer des éléments à mi-itération, vous devrez le faire via un Iterator (voir La réponse de Karim79). Cependant, la modification des valeurs d'élément est OK (voir Map.Entry).


4119
2018-06-30 23:28



Extrait de la référence Comment faire une itération sur une carte en Java:

Il y a plusieurs façons d'itérer sur un Map en Java. Passons en revue les méthodes les plus courantes et passons en revue leurs avantages et leurs inconvénients. Puisque toutes les cartes de Java implémentent l'interface Map, les techniques suivantes fonctionneront pour n'importe quelle implémentation de map (HashMap, TreeMap, LinkedHashMap, Hashtable, etc.)

Méthode n ° 1: Itérer sur les entrées à l'aide d'une boucle For-Each.

C'est la méthode la plus courante et préférable dans la plupart des cas. Il devrait être utilisé si vous avez besoin de deux 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. Aussi une boucle For-Each lancera NullPointerException Si vous essayez d'itérer sur une carte qui est nulle, alors avant d'itérer, vous devriez toujours vérifier les références nulles.

Méthode n ° 2: Itérer sur des clés ou des valeurs à l'aide d'une boucle For-Each.

Si vous n'avez besoin que de clés ou de valeurs de la carte, vous pouvez passer par-dessus keySet ou les 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 de performance par rapport à entrySet itération (environ 10% plus rapide) et est plus propre.

Méthode n ° 3: Itérer en utilisant Iterator.

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 parcourir plus de keySet ou des valeurs.

Cette méthode peut sembler redondante, mais elle a ses propres avantages. Tout d'abord, c'est la seule façon 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 l'itération For-Each vous obtiendrez des "résultats imprévisibles" selon Javadoc.

Du point de vue des performances, cette méthode est égale à une itération For-Each.

Méthode n ° 4: Itérer sur les clés et rechercher des 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 n ° 1, mais en pratique c'est plutôt lent et inefficace car l'obtention de valeurs par une clé peut prendre beaucoup de temps (cette méthode dans différentes implémentations Map est 20 à 200% plus lente que la méthode n ° 1 ). Si vous avez installé FindBugs, il le détectera et vous avertira d'une itération inefficace. Cette méthode devrait être évitée.

Conclusion:

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


739
2017-12-08 14:19



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 ne sont pas concernés par les clés, vous pouvez utiliser:

Collection<?> values = map.values();

77
2018-06-30 23:43



for (Map.Entry<String, String> item : params.entrySet()) {
    String key = item.getKey();
    String value = item.getValue();
}

70
2017-07-23 01:28



Plus intelligent:

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

55
2017-08-11 10:01



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

Une mauvaise pratique serait de parcourir toutes les clés, puis dans la boucle, faites toujours map.get(key) pour avoir la valeur. Si vous faites cela, alors la première option que j'ai écrite est pour vous.


40
2018-06-30 23:29