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

23voto

Basil Bourque Punkte 256611

Wenn ich ein Objekt habe, das die Map-Schnittstelle in Java implementiert, und ich möchte über jedes darin enthaltene Paar iterieren, was ist der effizienteste Weg, die Map zu durchlaufen?

Wenn die Effizienz der Tastenschleife für Ihre Anwendung Priorität hat, dann wählen Sie eine Map Implementierung, die die Schlüssel in der von Ihnen gewünschten Reihenfolge verwaltet.

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

Ja, absolut.

  • Einige Map Implementierungen versprechen eine bestimmte Iterationsreihenfolge, andere nicht.
  • Verschiedene Implementierungen von Map eine andere Reihenfolge der Schlüssel-Wert-Paare beibehalten.

Siehe diese von mir erstellte Tabelle mit einer Zusammenfassung der verschiedenen Map Implementierungen, die mit Java 11 gebündelt werden. Beachten Sie insbesondere die Iterationsreihenfolge Spalte. Klicken/Tippen Sie zum Zoomen.

Table of map implementations in Java 11, comparing their features

Sie können sehen, dass es vier Map Implementierungen, die eine Ordnung aufrechterhalten :

  • TreeMap
  • ConcurrentSkipListMap
  • LinkedHashMap
  • EnumMap

NavigableMap Schnittstelle

Zwei davon implementieren die NavigableMap Schnittstelle: TreeMap & ConcurrentSkipListMap .

Die älteren SortedMap Schnittstelle wird durch das neuere NavigableMap Schnittstelle. Möglicherweise finden Sie jedoch Implementierungen von Drittanbietern, die nur die ältere Schnittstelle implementieren.

Natürliche Ordnung

Wenn Sie eine Map die ihre Paare nach der "natürlichen Reihenfolge" des Schlüssels anordnet, verwenden Sie TreeMap ou ConcurrentSkipListMap . Der Begriff "natürliche Ordnung" bezeichnet die Klasse der Schlüssel, die Comparable . Der Wert, der von der compareTo Methode wird zum Vergleich bei der Sortierung verwendet.

Individuelle Bestellung

Wenn Sie eine benutzerdefinierte Sortierroutine für Ihre Schlüssel angeben möchten, die zur Aufrechterhaltung einer sortierten Reihenfolge verwendet werden soll, übergeben Sie eine Comparator Implementierung, die der Klasse Ihrer Schlüssel entspricht. Verwenden Sie entweder TreeMap ou ConcurrentSkipListMap , vorbei an Ihrem Comparator .

Ursprünglicher Einfügeauftrag

Wenn Sie möchten, dass die Paare Ihrer Karte in ihrer ursprünglichen Reihenfolge, in der Sie sie in die Karte eingefügt haben, beibehalten werden, verwenden Sie LinkedHashMap .

Reihenfolge der Enum-Definitionen

Wenn Sie eine Aufzählung verwenden, wie z. B. DayOfWeek ou Month als Ihre Schlüssel, verwenden Sie die EnumMap Klasse. Diese Klasse ist nicht nur sehr Das Programm ist so optimiert, dass es sehr wenig Speicherplatz benötigt und sehr schnell läuft. Es verwaltet Ihre Paare in der durch die Aufzählung definierten Reihenfolge. Für DayOfWeek zum Beispiel der Schlüssel von DayOfWeek.MONDAY wird bei der Iteration zuerst gefunden, und der Schlüssel von DayOfWeek.SUNDAY werden die letzten sein.

Andere Überlegungen

Bei der Auswahl eines Map Umsetzung, auch berücksichtigen:

  • NULLen. Einige Implementierungen verbieten/akzeptieren einen NULL-Wert als Schlüssel und/oder Wert.
  • Gleichzeitigkeit. Wenn Sie die Map threadübergreifend bearbeiten, müssen Sie eine Implementierung verwenden, die Gleichzeitigkeit unterstützt. Oder verpacken Sie die Map mit Collections::synchronizedMap (weniger wünschenswert).

Beide Überlegungen sind in der obigen grafischen Tabelle enthalten.

22voto

dmunozfer Punkte 510

Wenn Sie eine generische, nicht typisierte Map haben, können Sie diese verwenden:

Map map = new HashMap();
for (Map.Entry entry : ((Set<Map.Entry>) map.entrySet())) {
    System.out.println(entry.getKey() + "/" + entry.getValue());
}

21voto

anand krish Punkte 3595

Dies sind alle möglichen Arten der Iteration von HashMap.

HashMap<Integer,String> map=new HashMap<Integer,String>();
    map.put(1,"David");  //Adding elements in Map
    map.put(2,"John");
    map.put(4,"Samyuktha");
    map.put(3,"jasmin");
    System.out.println("Iterating Hashmap...");

    //way 1 (java 8 Method)
    map.forEach((key, value) -> {
        System.out.println(key+" : "+ value);
    });

    //way 2 (java 7 Method)
    for(Map.Entry me : map.entrySet()){
        System.out.println(me.getKey()+" "+me.getValue());
    }

    //way 3 (Legacy way to iterate HashMap)
    Iterator iterator = map.entrySet().iterator();//map.keySet().iterator()
    while (iterator.hasNext())
    {
        Map.Entry me =(Map.Entry)iterator.next();
        System.out.println(me.getKey()+" : "+ me.getValue());
    }

}

21voto

Fathah Rehman P Punkte 7871
public class abcd{
    public static void main(String[] args)
    {
       Map<Integer, String> testMap = new HashMap<Integer, String>();
        testMap.put(10, "a");
        testMap.put(20, "b");
        testMap.put(30, "c");
        testMap.put(40, "d");
        for (Integer key:testMap.keySet()) {
            String value=testMap.get(key);
            System.out.println(value);
        }
    }
}

OR

public class abcd {
    public static void main(String[] args)
    {
       Map<Integer, String> testMap = new HashMap<Integer, String>();
        testMap.put(10, "a");
        testMap.put(20, "b");
        testMap.put(30, "c");
        testMap.put(40, "d");
        for (Entry<Integer, String> entry : testMap.entrySet()) {
            Integer key=entry.getKey();
            String value=entry.getValue();
        }
    }
}

17voto

Fadid Punkte 1180
    Iterator iterator = map.entrySet().iterator();
    while (iterator.hasNext()) {
        Map.Entry element = (Map.Entry)it.next();
        LOGGER.debug("Key: " + element.getKey());
        LOGGER.debug("value: " + element.getValue());    
    }

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