Iterate via un HashMap [dupliquer]
possibilité de dupliquer:
Comment faire pour itérer efficacement sur chaque entrée dans une "carte"?
Quelle est la meilleure façon d'itérer les articles dans un HashMap
?
7 réponses
Itérer entrySet()
comme suit:
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
}
}
plus d'informations à propos Map
.
si vous êtes seulement intéressé par les clés, vous pouvez itérer à travers 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 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 aurez besoin de faites-le par L'Intermédiaire d'un itérateur (voir réponse de karim79 ). Cependant, changer les valeurs des articles est OK (voir Map.Entry
).
extrait de la référence comment itérer sur une carte en Java :
il y a plusieurs façons d'itérer un Map
en Java. Voici les méthodes les plus courantes et d'examiner leurs avantages et inconvénients. Puisque toutes les cartes en Java implémentent l'interface de carte, les techniques suivantes fonctionneront pour n'importe quelle implémentation de carte( HashMap
, TreeMap
, LinkedHashMap
, Hashtable
, etc.)
Méthode #1 : itération des entrées utilisant une boucle pour chaque boucle.
il s'agit de 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 touches map 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 pour chaque boucle a été introduite en Java 5, donc cette méthode ne fonctionne que dans les versions plus récentes du langage. Aussi un pour-chaque boucle lancera NullPointerException
si vous essayez pour itérer sur une carte qui est nulle,donc avant d'itérer vous devriez toujours vérifier les références nulles.
Méthode #2 : itération sur clés ou valeurs en utilisant une boucle pour chaque boucle.
si vous n'avez besoin que des clés ou des valeurs de la carte, vous pouvez itérer sur les clés ou les valeurs au lieu d'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 à l'itération entrySet
(environ 10% plus rapide).) et est plus propre.
la Méthode #3 : une Itération à l'aide d'un Itérateur.
Utilisant Des 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 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 l'ancien les 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 iterator.remove()
. Si vous essayez de le faire pendant chaque itération, vous obtiendrez des "résultats imprévisibles" selon Javadoc .
du point de vue des performances, cette méthode est égale à une itération pour chaque itération.
méthode #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 sembler comme une alternative plus propre pour la méthode #1, mais dans la pratique c'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 lent que la méthode #1). Si vous avez FindBugs installé, il détectera ceci et vous avertira de l'itération inefficace. Cette méthode doit être évitée.
Conclusion:
si vous n'avez besoin que des clés ou des valeurs de la carte, Utilisez la méthode #2. Si vous êtes bloqué avec une ancienne version de Java (moins de 5) ou que 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.
for (Map.Entry<String, String> item : params.entrySet()) {
String key = item.getKey();
String value = item.getValue();
}
vous pouvez itérer 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 ne vous souciez pas des touches, vous pouvez utiliser:
Collection<?> values = map.values();
plus Intelligente:
for (String key : hashMap.keySet()) {
System.out.println("Key: " + key + ", Value: " + map.get(key));
}
ça dépend. Si vous savez que vous allez avoir besoin de la clé et la valeur de chaque entrée, puis passez par le entrySet
. Si vous avez juste besoin des valeurs, alors il y a la méthode values()
. Et si vous avez juste besoin des clés, utilisez keyset()
.
Une mauvaise pratique serait pour itérer sur toutes les touches, puis dans la boucle, toujours faire map.get(key)
pour obtenir la valeur. Si tu fais ça, alors la première option que j'ai écrite est pour toi.