Frage Iterate durch eine HashMap [Duplikat]


Mögliche Duplikate: 
Wie man effizient über jeden Eintrag in einer 'Karte' iteriert?

Was ist der beste Weg, um über die Elemente in einem iterieren HashMap?


2827
2018-06-30 23:24


Ursprung


Antworten:


Iterieren durch die entrySet() so:

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.


2835
2018-06-30 23:27



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

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

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

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

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

Schließlich, wenn Sie 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();
    // ...
}

Ein Vorbehalt: Wenn Sie Elemente während der Iteration entfernen möchten, müssen Sie dies über einen Iterator tun (siehe Karim79's Antwort). Das Ändern von Objektwerten ist jedoch OK (siehe Map.Entry).


4119
2018-06-30 23:28



Aus der Referenz extrahiert Wie man über eine Karte in Java iteriert:

Es gibt mehrere Möglichkeiten zum Iterieren über einen Map in Java. Lassen Sie uns über die gängigsten Methoden sprechen und ihre Vor- und Nachteile überprüfen. Da alle Karten in Java die Map-Schnittstelle implementieren, funktionieren die folgenden Techniken für jede Kartenimplementierung (HashMap, TreeMap, LinkedHashMap, Hashtable, etc.)

Methode 1: Iterieren über Einträge mit einer For-Each-Schleife.

Dies ist die gebräuchlichste Methode und wird in den meisten Fällen bevorzugt. Es sollte verwendet werden, wenn Sie sowohl Map-Schlüssel 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. Daher funktioniert diese Methode nur in neueren Versionen der Sprache. Auch eine For-Each-Schleife wird geworfen NullPointerException Wenn Sie versuchen, eine Map zu durchlaufen, die null ist, sollten Sie vor dem Iterieren immer nach Nullreferenzen suchen.

Methode # 2: Iterieren über Schlüssel oder Werte mit einer For-Each-Schleife.

Wenn Sie nur Schlüssel oder Werte aus der Map benötigen, können Sie anstelle von entrySet über keySet oder Werte iterieren.

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 entrySet Iteration (ca. 10% schneller) und ist sauberer.

Methode # 3: Iterieren mit Iterator.

Generics verwenden:

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 zum Iterieren verwenden keySet oder Werte.

Diese Methode mag überflüssig erscheinen, aber sie hat ihre eigenen Vorteile. Erstens ist es die einzige Möglichkeit, in älteren Java-Versionen über eine Map zu iterieren. Das andere wichtige Merkmal ist, dass es die einzige Methode ist, die es Ihnen ermöglicht, Einträge während der Iteration durch Aufrufen aus der Map zu entfernen iterator.remove(). Wenn Sie dies während For-Each-Iteration versuchen, erhalten Sie "unvorhersehbare Ergebnisse" gemäß Javadoc.

Unter dem Gesichtspunkt der Leistung entspricht diese Methode einer For-Each-Iteration.

Methode # 4: Iterieren über Schlüssel 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 mag für die Methode 1 eine sauberere Alternative sein, in der Praxis ist sie jedoch ziemlich langsam und ineffizient, da das Abrufen von Werten mit einem Schlüssel zeitraubend sein kann (diese Methode in verschiedenen Map-Implementierungen ist 20% -200% langsamer als Methode 1) ). Wenn Sie FindBugs installiert haben, erkennt es dies und warnt Sie vor ineffizienter Iteration. Diese Methode sollte vermieden werden.

Fazit:

Wenn Sie nur Schlüssel oder Werte von der Karte benötigen, verwenden Sie Methode 2. Wenn Sie mit einer älteren Version von Java (weniger als 5) festhängen oder planen, Einträge während der Iteration zu entfernen, müssen Sie Methode 3 verwenden. Ansonsten verwende Methode # 1.


739
2017-12-08 14:19



Sie können die Einträge in a durchlaufen Map In vielen Wegen. 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 bekommen

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 erhalten möchten und sich nicht mit den Schlüsseln beschäftigen, können Sie Folgendes verwenden:

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



Intelligenter:

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

55
2017-08-11 10:01



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

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


40
2018-06-30 23:29