it-swarm-eu.dev

Durch eine HashMap iterieren

Mögliches Duplikat:
Wie kann jeder Eintrag in einer 'Map' effizient durchlaufen werden?

Wie können Sie die Elemente in einem HashMap am besten durchlaufen?

3177
burntsugar

Durchlaufen Sie die entrySet() wie folgt:

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

Lesen Sie mehr über Map .

3117
karim79

Wenn Sie nur an den Schlüsseln interessiert sind, können Sie das keySet() der Karte durchlaufen:

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

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

Wenn Sie nur die Werte benötigen, verwenden Sie values() :

_for (Object value : map.values()) {
    // ...
}
_

Wenn Sie zum Schluss sowohl den Schlüssel als auch den Wert möchten, verwenden Sie entrySet() :

_for (Map.Entry<String, Object> entry : map.entrySet()) {
    String key = entry.getKey();
    Object value = entry.getValue();
    // ...
}
_

Eine Einschränkung: Wenn Sie Elemente während der Iteration entfernen möchten, müssen Sie dies über einen Iterator tun (siehe Antwort von karim79 ). Das Ändern von Elementwerten ist jedoch in Ordnung (siehe Map.Entry ).

4522
harto

Auszug aus der Referenz Wie man in Java über eine Karte iteriert:

Es gibt verschiedene Möglichkeiten, einen Map in Java zu durchlaufen. Lassen Sie uns die gebräuchlichsten Methoden durchgehen und ihre Vor- und Nachteile untersuchen. Da alle Maps in Java die Map-Schnittstelle implementieren, funktionieren die folgenden Techniken für jede Map-Implementierung (HashMap, TreeMap, LinkedHashMap, Hashtable usw.)

Methode 1 : Durchlaufen von Einträgen mit einer For-Each-Schleife.

Dies ist die häufigste Methode und in den meisten Fällen vorzuziehen. Es sollte verwendet werden, wenn Sie sowohl Map-Keys als auch Werte in der Schleife benötigen.

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

Beachten Sie, dass die For-Each-Schleife in Java 5 eingeführt wurde, sodass diese Methode nur in neueren Versionen der Sprache funktioniert. Auch eine For-Each-Schleife gibt NullPointerException aus, wenn Sie versuchen, über eine Map zu iterieren, die null ist. Bevor Sie also iterieren, sollten Sie immer nach null Referenzen suchen.

Methode 2 : Durchlaufen von Schlüsseln oder Werten mit einer For-Each-Schleife.

Wenn Sie nur Schlüssel oder Werte aus der Map benötigen, können Sie KeySet oder Werte anstelle von EntrySet durchlaufen.

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

Diese Methode bietet einen leichten Leistungsvorteil gegenüber der Iteration entrySet (etwa 10% schneller) und ist sauberer.

Methode 3 : Iterieren mit Iterator.

Verwenden von Generika:

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

Ohne Generika:

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

Sie können dieselbe Technik auch verwenden, um keySet oder Werte zu durchlaufen.

Diese Methode mag redundant aussehen, hat aber ihre eigenen Vorteile. Erstens ist dies die einzige Möglichkeit, in älteren Java-Versionen über eine Karte zu iterieren. Das andere wichtige Feature ist, dass es die einzige Methode ist, mit der Sie während der Iteration Einträge aus der Karte entfernen können, indem Sie iterator.remove() aufrufen. Wenn Sie dies während der For-Each-Iteration versuchen, erhalten Sie "unvorhersehbare Ergebnisse" gemäß Javadoc .

Aus Sicht der Leistung entspricht diese Methode einer For-Each-Iteration.

Methode 4 : Durchlaufen von Schlüsseln und Suchen nach Werten (ineffizient).

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

Dies scheint eine sauberere Alternative für Methode 1 zu sein, ist jedoch in der Praxis ziemlich langsam und ineffizient, da das Abrufen von Werten über einen Schlüssel möglicherweise zeitaufwändig ist (diese Methode ist in verschiedenen Map-Implementierungen 20% -200% langsamer als Methode 1) ). Wenn Sie FindBugs installiert haben, wird dies erkannt und Sie werden vor ineffizienter Iteration gewarnt. Diese Methode sollte vermieden werden.

Fazit:

Wenn Sie nur Schlüssel oder Werte aus der Karte benötigen, verwenden Sie Methode 2. Wenn Sie mit einer älteren Version von Java (weniger als 5) nicht weiterkommen oder Einträge während der Iteration entfernen möchten, müssen Sie Methode 3 verwenden. Verwenden Sie andernfalls Methode 1.

810
arvind
for (Map.Entry<String, String> item : hashMap.entrySet()) {
    String key = item.getKey();
    String value = item.getValue();
}
148
gabor

Sie können die Einträge in einem Map auf verschiedene Arten durchlaufen. Holen Sie sich jeden Schlüssel und Wert wie folgt:

Map<?,?> map = new HashMap<Object, Object>();
for(Entry<?, ?> e: map.entrySet()){
    System.out.println("Key " + e.getKey());
    System.out.println("Value " + e.getValue());
}

Oder Sie können die Liste der Schlüssel mit abrufen

Collection<?> keys = map.keySet();
for(Object key: keys){
    System.out.println("Key " + key);
    System.out.println("Value " + map.get(key));
}

Wenn Sie nur alle Werte abrufen möchten und sich nicht mit den Schlüsseln befassen, können Sie Folgendes verwenden:

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

Schlauer:

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

Hängt davon ab. Wenn Sie wissen, dass Sie sowohl den Schlüssel als auch den Wert jedes Eintrags benötigen, lesen Sie das entrySet. Wenn Sie nur die Werte benötigen, gibt es die Methode values(). Und wenn Sie nur die Tasten benötigen, verwenden Sie keyset().

Eine schlechte Praxis wäre, alle Tasten zu durchlaufen und dann innerhalb der Schleife immer map.get(key) zu tun, um den Wert zu erhalten. Wenn Sie das tun, dann ist die erste Option, die ich geschrieben habe, für Sie.

45
Gary Kephart