Gibt es in Java ein Objekt, das sich wie eine Map zum Speichern und Zugreifen auf Schlüssel / Wert-Paare verhält, jedoch eine geordnete Liste von Schlüsseln und eine geordnete Liste von Werten zurückgeben kann, sodass die Schlüssel- und Wertelisten in derselben Reihenfolge liegen?
Als Erklärung durch Code suche ich nach etwas, das sich wie meine fiktive OrderedMap verhält:
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);
}
java
collections
Was ist es
quelle
quelle
LinkedHashMap
.Antworten:
Die SortedMap- Schnittstelle (mit der Implementierung TreeMap ) sollte Ihr Freund sein.
Die Schnittstelle hat die Methoden:
keySet()
Dies gibt einen Satz der Schlüssel in aufsteigender Reihenfolge zurückvalues()
Dies gibt eine Sammlung aller Werte in aufsteigender Reihenfolge der entsprechenden Schlüssel zurückDiese Schnittstelle erfüllt also genau Ihre Anforderungen. Die Schlüssel müssen jedoch eine aussagekräftige Reihenfolge haben. Andernfalls können Sie die LinkedHashMap verwenden, bei der die Reihenfolge durch die Einfügereihenfolge bestimmt wird.
quelle
LinkedHashMap
deren Reihenfolge der Iteration ist die Reihenfolge, in der zuletzt auf seine Einträge zugegriffen wurdeLinkedHashMap
die Iterationsreihenfolge die Einfügereihenfolge. Sie können jedoch stattdessen einen anderen Konstruktor verwenden, um die Zugriffsreihenfolge anzugeben. docs.oracle.com/javase/8/docs/api/java/util/…Sie suchen nach java.util.LinkedHashMap . Sie erhalten eine Liste der Map.Entry <K, V> -Paare, die immer in derselben Reihenfolge wiederholt werden. Diese Reihenfolge entspricht der Reihenfolge, in der Sie die Elemente eingeben . Alternativ können Sie auch die Datei java.util.SortedMap verwenden , bei der die Schlüssel entweder eine natürliche Reihenfolge haben oder durch a angegeben werden müssen
Comparator
.quelle
keySet()
Methode effektiv ein LinkedHashSet zurück, das die Reihenfolge Ihrerput()
Aufrufe widerspiegelt . Beachten Sie, dass wiederholte Anrufeput()
für denselben Schlüssel die Reihenfolge nur ändern, wenn Sie zuvorremove()
den Schlüssel eingegeben haben.LinkedHashMap
deren Reihenfolge der Iteration ist die Reihenfolge, in der zuletzt auf seine Einträge zugegriffen wurdeLinkedHashMap behält die Reihenfolge der Schlüssel bei.
java.util.LinkedHashMap scheint ansonsten genau wie eine normale HashMap zu funktionieren.
quelle
Ich denke, die nächste Sammlung, die Sie vom Framework erhalten, ist die SortedMap
quelle
Sie können die NavigableMap- Oberfläche nutzen, auf die in aufsteigender oder absteigender Schlüsselreihenfolge zugegriffen und diese durchlaufen werden kann. Diese Schnittstelle soll die SortedMap-Schnittstelle ersetzen. Die navigierbare Karte wird normalerweise nach der natürlichen Reihenfolge ihrer Schlüssel oder nach einem Komparator sortiert, der zum Zeitpunkt der Kartenerstellung bereitgestellt wird.
Es gibt drei nützlichste Implementierungen davon: TreeMap , ImmutableSortedMap und ConcurrentSkipListMap .
TreeMap-Beispiel:
Ausgabe:
quelle
Ich denke, die SortedMap-Schnittstelle erzwingt, wonach Sie fragen, und TreeMap implementiert dies.
http://java.sun.com/j2se/1.5.0/docs/api/java/util/SortedMap.html http://java.sun.com/j2se/1.5.0/docs/api/java/util /TreeMap.html
quelle
Seit Java 6 gibt es auch eine nicht blockierende thread-sichere Alternative zu TreeMap . Siehe ConcurrentSkipListMap .
quelle
tl; dr
Damit
Map< Integer , String >
in einer Reihenfolge sortiert nach Schlüssel, verwenden Sie eine der beiden Klassen die ImplementierungSortedMap
/NavigableMap
Schnittstellen:TreeMap
ConcurrentSkipListMap
Wenn Sie die Map innerhalb eines einzelnen Threads bearbeiten, verwenden Sie den ersten ,
TreeMap
. Wenn Sie über mehrere Threads hinweg manipulieren, verwenden Sie die zweite Option.ConcurrentSkipListMap
.Einzelheiten finden Sie in der folgenden Tabelle und in der folgenden Diskussion.
Einzelheiten
Hier ist eine grafische Tabelle, die ich erstellt habe und die die Merkmale der Zehn zeigt
Map
mit Java 11 gebündelten Implementierungen .Die
NavigableMap
Schnittstelle ist das, wasSortedMap
eigentlich hätte sein sollen. DasSortedMap
sollte logisch entfernt werden, kann aber nicht sein, da einige Kartenimplementierungen von Drittanbietern möglicherweise eine Schnittstelle verwenden.Wie Sie in dieser Tabelle sehen können, implementieren nur zwei Klassen die
SortedMap
/NavigableMap
-Schnittstellen:TreeMap
ConcurrentSkipListMap
Beide halten die Schlüssel in sortierter Reihenfolge, entweder nach ihrer natürlichen Reihenfolge (unter Verwendung der
compareTo
Methode vonComparable
( https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/). Comparable.html ) Schnittstelle) oder von einerComparator
Implementierung, die Sie übergeben. Der Unterschied zwischen diesen beiden Klassen ist , dass die zweite,ConcurrentSkipListMap
ist threadsicher , hoch gleichzeitige .Siehe auch die Spalte Iterationsreihenfolge in der folgenden Tabelle.
LinkedHashMap
Klasse gibt ihre Einträge in der Reihenfolge zurück, in der sie ursprünglich eingefügt wurden .EnumMap
Gibt Einträge in der Reihenfolge zurück, in der die Aufzählungsklasse des Schlüssels definiert ist . Beispielsweise verwendet eine Karte, deren Mitarbeiter welchen Wochentag abdeckt (Map< DayOfWeek , Person >
), dieDayOfWeek
in Java integrierte Enum-Klasse. Diese Aufzählung wird mit Montag zuerst und Sonntag zuletzt definiert. Einträge in einem Iterator werden also in dieser Reihenfolge angezeigt.Die anderen sechs Implementierungen geben kein Versprechen über die Reihenfolge, in der sie ihre Einträge melden.
quelle
Ich habe Simple Hash Map, verknüpfte Liste und Sammlungen verwendet , um eine Map nach Werten zu sortieren.
Die Ausgabe ist:
quelle