391 Stimmen

Java geordnete Karte

Gibt es in Java ein Objekt, das sich wie eine Map verhält, um Schlüssel/Wert-Paare zu speichern und darauf zuzugreifen, aber eine geordnete Liste von Schlüsseln und eine geordnete Liste von Werten zurückgeben kann, so dass die Schlüssel- und Wertelisten in der gleichen Reihenfolge sind?

Also als Erklärung-by-Code, ich bin für etwas, das wie meine fiktive OrderedMap verhält suchen:

OrderedMap<Integer, String> om = new OrderedMap<>();
om.put(0, "Zero");
om.put(7, "Seven");

String o = om.get(7); // o is "Seven"
List<Integer> keys = om.getKeys();
List<String> values = om.getValues();

for(int i = 0; i < keys.size(); i++)
{
    Integer key = keys.get(i);
    String value = values.get(i);
    Assert(om.get(key) == value);
}

486voto

dmeister Punkte 33302

En SortedMap Schnittstelle (mit der Implementierung TreeMap ) sollte Ihr Freund sein.

Die Schnittstelle hat die Methoden:

  • keySet() die eine Menge der Schlüssel in aufsteigender Reihenfolge zurückgibt
  • values() die eine Sammlung aller Werte in aufsteigender Reihenfolge der entsprechenden Schlüssel zurückgibt

Diese Schnittstelle erfüllt also genau Ihre Anforderungen. Allerdings müssen die Schlüssel eine sinnvolle Reihenfolge haben. Ansonsten können Sie die LinkedHashMap wobei die Reihenfolge durch die Einfügereihenfolge bestimmt wird.

251voto

John Feminella Punkte 292907

Gibt es ein Objekt, das wie eine Map für die Speicherung und den Zugriff auf Schlüssel/Wert-Paare funktioniert, aber eine geordnete Liste von Schlüsseln und eine geordnete Liste von Werten zurückgeben kann, so dass die Schlüssel- und Wertelisten in der gleichen Reihenfolge sind?

Sie suchen nach java.util.LinkedHashMap . Sie erhalten eine Liste mit Map.Entry<K,V> Paare, die immer in der gleichen Reihenfolge durchlaufen werden. Diese Reihenfolge entspricht der Reihenfolge, in der Sie die Elemente eingefügt haben. Alternativ dazu können Sie die java.util.SortedMap , wobei die Schlüssel entweder einen natürliche Ordnung oder lassen Sie es durch eine Comparator .

43voto

VoNWooDSoN Punkte 1036

LinkedHashMap behält die Reihenfolge der Schlüssel bei.

java.util.LinkedHashMap scheint ansonsten genau wie eine normale HashMap zu funktionieren.

8voto

Basil Bourque Punkte 256611

Tl;dr

Um die Map< Integer , String > in einer nach Schlüssel sortierten Reihenfolge zu erstellen, verwenden Sie eine der beiden Klassen, die die SortedMap / NavigableMap Schnittstellen:

oder Implementierungen Dritter. Vielleicht in Google Guava o Eclipse-Kollektionen (Ich habe es nicht überprüft).

Wenn Sie die Karte in einem einzigen Thread bearbeiten, verwenden Sie den ersten, TreeMap . Wenn Sie über mehrere Threads hinweg manipulieren, verwenden Sie den zweiten, ConcurrentSkipListMap .

Einzelheiten sind der nachstehenden Tabelle und den folgenden Ausführungen zu entnehmen.

Einzelheiten

Hier ist eine grafische Tabelle, die ich erstellt habe und die die Merkmale der zehn Map Implementierungen, die mit Java 11 gebündelt werden.

En NavigableMap Schnittstelle ist der Nachfolger von SortedMap . En SortedMap sollte logischerweise entfernt werden, kann es aber nicht, da einige Kartenimplementierungen von Drittanbietern die Schnittstelle verwenden können.

Wie Sie in dieser Tabelle sehen können, implementieren nur zwei Klassen die SortedMap / NavigableMap Schnittstellen:

Beide halten die Schlüssel in sortierter Reihenfolge, entweder nach ihrer natürlichen Reihenfolge (mit compareTo Methode der Comparable ( https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Comparable.html ) Schnittstelle) oder durch eine Comparator Implementierung bestehen Sie. Der Unterschied zwischen diesen beiden Klassen ist, dass die zweite Klasse, ConcurrentSkipListMap ist thread-safe hoch gleichzeitig .

をご覧ください。 Iterationsreihenfolge Spalte in der nachstehenden Tabelle.

  • En LinkedHashMap Klasse gibt ihre Einträge in der Reihenfolge zurück, in der sie ursprünglich eingefügt .
  • EnumMap gibt die Einträge in der Reihenfolge zurück, in der die Enum-Klasse des Schlüssels definiert ist . Zum Beispiel eine Karte, die zeigt, welcher Mitarbeiter für welchen Wochentag zuständig ist ( Map< DayOfWeek , Person > ) verwendet die DayOfWeek Enum-Klasse, die in Java integriert ist. Diese Aufzählung ist so definiert, dass der Montag an erster und der Sonntag an letzter Stelle steht. Die Einträge in einem Iterator werden also in dieser Reihenfolge angezeigt.

Die anderen sechs Umsetzungen machen keine Zusagen über die Reihenfolge, in der sie ihre Einträge melden.

Table of map implementations in Java 11, comparing their features

7voto

Vitalii Fedorenko Punkte 103468

Sie können Folgendes nutzen NavigableMap Schnittstelle, auf die in auf- oder absteigender Reihenfolge der Schlüssel zugegriffen werden kann und die durchlaufen werden kann. Diese Schnittstelle ist an die Stelle treten soll die SortedMap-Schnittstelle. Die Navigable-Map wird in der Regel nach der natürlichen Reihenfolge ihrer Schlüssel oder nach einem Comparator sortiert, der bei der Erstellung der Map bereitgestellt wird.

Es gibt drei sehr nützliche Implementierungen davon: TreeMap , ImmutableSortedMap et ConcurrentSkipListMap .

TreeMap Beispiel:

TreeMap<String, Integer> users = new TreeMap<String, Integer>();
users.put("Bob", 1);
users.put("Alice", 2);
users.put("John", 3);

for (String key: users.keySet()) {
  System.out.println(key + " (ID = "+ users.get(key) + ")");
}

Ausgabe:

Alice (ID = 2)
Bob (ID = 1)
John (ID = 3)

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