3898 Stimmen

Wie kann ich effizient über jeden Eintrag in einer Java Map iterieren?

Wenn ich ein Objekt habe, das die Map Schnittstelle in Java und ich möchte über jedes darin enthaltene Paar iterieren. Wie kann ich die Karte am effizientesten durchlaufen?

Hängt die Reihenfolge der Elemente von der spezifischen Kartenimplementierung ab, die ich für die Schnittstelle habe?

46 Stimmen

In Java 8 mit Lambda-Ausdruck: stackoverflow.com/a/25616206/1503859

5 Stimmen

132voto

serg Punkte 106383

Beispiel für die Verwendung von Iteratoren und Generika:

Iterator<Map.Entry<String, String>> entries = myMap.entrySet().iterator();
while (entries.hasNext()) {
  Map.Entry<String, String> entry = entries.next();
  String key = entry.getKey();
  String value = entry.getValue();
  // ...
}

109voto

serg10 Punkte 30302

Dies ist eine zweiteilige Frage:

Wie man über die Einträge einer Karte iteriert - @ScArcher2 hat antwortete das perfekt.

Wie lautet die Reihenfolge der Iteration? - wenn Sie nur Map dann gibt es streng genommen keine Bestellgarantie . Man sollte sich also nicht wirklich auf die Reihenfolge verlassen, die eine Implementierung vorgibt. Allerdings ist die SortedMap Schnittstelle erweitert Map und bietet genau das, wonach Sie suchen - Implementierungen werden immer eine konsistente Sortierreihenfolge liefern.

NavigableMap ist eine weitere nützliche Erweiterung - Dies ist ein SortedMap mit zusätzlichen Methoden zum Auffinden von Einträgen anhand ihrer geordneten Position in der Schlüsselmenge. Dadurch kann möglicherweise die Notwendigkeit einer Iteration entfallen - Sie könnten die spezifischen entry Sie sind nach der Verwendung der higherEntry , lowerEntry , ceilingEntry ou floorEntry Methoden. Die Website descendingMap Methode bietet Ihnen sogar eine explizite Methode zur Umkehrung der Traversalreihenfolge .

90voto

Darshan Patel Punkte 4095

Es gibt mehrere Möglichkeiten, über die Karte zu iterieren.

Hier ist ein Vergleich ihrer Leistungen für einen gemeinsamen Datensatz, der in map gespeichert ist, indem eine Million Schlüssel-Wert-Paare in map gespeichert werden und über map iteriert wird.

1) Verwendung entrySet() in der for each-Schleife

for (Map.Entry<String,Integer> entry : testMap.entrySet()) {
    entry.getKey();
    entry.getValue();
}

50 Millisekunden

2) Verwendung keySet() in der for each-Schleife

for (String key : testMap.keySet()) {
    testMap.get(key);
}

76 Millisekunden

3) Verwendung entrySet() und Iterator

Iterator<Map.Entry<String,Integer>> itr1 = testMap.entrySet().iterator();
while(itr1.hasNext()) {
    Map.Entry<String,Integer> entry = itr1.next();
    entry.getKey();
    entry.getValue();
}

50 Millisekunden

4) Verwendung keySet() und Iterator

Iterator itr2 = testMap.keySet().iterator();
while(itr2.hasNext()) {
    String key = itr2.next();
    testMap.get(key);
}

75 Millisekunden

Ich habe auf this link .

64voto

ckpwong Punkte 2019

Zu Ihrer Information: Sie können auch Folgendes verwenden map.keySet() y map.values() wenn Sie nur an den Schlüsseln/Werten der Karte und nicht an den anderen interessiert sind.

63voto

Chris Dail Punkte 24971

Die korrekte Vorgehensweise besteht darin, die akzeptierte Antwort zu verwenden, da sie am effizientesten ist. Ich finde, der folgende Code sieht etwas sauberer aus.

for (String key: map.keySet()) {
   System.out.println(key + "/" + map.get(key));
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X