Ich suche eine Klasse in Java mit Schlüsselwertzuordnung, aber ohne Verwendung von Hashes. Folgendes mache ich derzeit:
Hashtable
Werte hinzu.Hashtable.entrySet()
.Map.Entry
für den Iterator.Module
(eine benutzerdefinierte Klasse) basierend auf dem Wert.Das Problem dabei ist, dass ich nicht die Kontrolle über die Reihenfolge habe, in der ich die Werte zurückerhalte, sodass ich die Werte in der angegebenen Reihenfolge nicht anzeigen kann (ohne die Reihenfolge fest zu codieren).
Ich würde dafür ein ArrayList
oder Vector
verwenden, aber später im Code muss ich das Module
-Objekt für einen bestimmten Schlüssel abrufen, was ich mit einem nicht tun kann ArrayList
oder Vector
.
Kennt jemand eine free/open-source Java Klasse, die dies tut, oder eine Möglichkeit, Werte aus einem Hashtable
zu erhalten, basierend auf dem Zeitpunkt, an dem sie hinzugefügt wurden?
Vielen Dank!
Ich schlage ein LinkedHashMap
oder ein TreeMap
vor. Ein LinkedHashMap
hält die Schlüssel in der Reihenfolge, in der sie eingefügt wurden, während ein TreeMap
über eine Comparator
oder die natürliche Comparable
Reihenfolge der Elemente sortiert bleibt.
Da die Elemente nicht sortiert bleiben müssen, sollte LinkedHashMap
in den meisten Fällen schneller sein. TreeMap
hat O(log n)
Leistung für containsKey
, get
, put
und remove
, gemäß Javadocs, während LinkedHashMap
für jedes O(1)
ist.
Wenn Ihre API im Gegensatz zu einer bestimmten Sortierreihenfolge nur eine vorhersehbare Sortierreihenfolge erwartet, sollten Sie die Schnittstellen verwenden, die diese beiden Klassen implementieren: NavigableMap
oder SortedMap
. Auf diese Weise können Sie bestimmte Implementierungen nicht in Ihre API einfließen lassen und anschließend nach Belieben zu einer dieser spezifischen Klassen oder zu einer völlig anderen Implementierung wechseln.
Wenn eine unveränderliche Karte Ihren Anforderungen entspricht , gibt es eine Bibliothek von Google mit dem Namen Guave (siehe auch Guavenfragen) )
Guava liefert eine ImmutableMap mit zuverlässiger benutzerspezifischer Iterationsreihenfolge. Diese ImmutableMap hat O(1) Leistung für containKey, get. Offensichtlich werden Put und Remove nicht unterstützt.
ImmutableMap Objekte werden entweder mit den eleganten statischen Hilfsmethoden of () und copyOf () oder mit einem Builder erstellt Objekt.
LinkedHashMap gibt die Elemente in der Reihenfolge zurück, in der sie in die Map eingefügt wurden, wenn Sie über das keySet (), entrySet () oder die Werte () der Map iterieren.
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("id", "1");
map.put("name", "rohan");
map.put("age", "26");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + " = " + entry.getValue());
}
Dadurch werden die Elemente in der Reihenfolge gedruckt, in der sie in die Karte eingefügt wurden:
id = 1
name = rohan
age = 26
Sie können ein Map
(für eine schnelle Suche) und ein List
(für eine Bestellung) pflegen, aber ein LinkedHashMap
ist möglicherweise das einfachste. Sie können auch ein SortedMap
versuchen, z. TreeMap
, die eine von Ihnen angegebene Reihenfolge haben.
Sie könnten meine Linked Tree Map Implementierung versuchen.
Ich weiß nicht, ob es Open Source ist, aber nach ein wenig googeln fand ich diese Implementierung von Map mit ArrayList . Es scheint Java vor Version 1.5 zu sein, daher sollten Sie es generieren, was einfach sein sollte. Beachten Sie, dass diese Implementierung O(N) Zugriff hat, aber dies sollte kein Problem sein, wenn Sie Ihrem JPanel nicht Hunderte von Widgets hinzufügen, was Sie sowieso nicht tun sollten.
Sie können LinkedHashMap verwenden, um die Hauptreihenfolge für das Einfügen in Map festzulegen
Die wichtigen Punkte über die Java LinkedHashMap-Klasse sind:
Eine LinkedHashMap enthält Werte, die auf dem Schlüssel 3 basieren. Sie kann einen Nullschlüssel und mehrere Nullwerte enthalten. 4. Es ist dasselbe wie HashMap, behält stattdessen die Einfügereihenfolge bei
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
Wenn Sie jedoch Werte in der Karte mithilfe eines benutzerdefinierten Objekts oder eines primitiven Datentypschlüssels sortieren möchten, sollten Sie TreeMap verwenden. Weitere Informationen finden Sie unter dieser Link
Wann immer ich die natürliche Reihenfolge der Dinge, die im Voraus bekannt sind, aufrechterhalten muss, verwende ich ein EnumMap
die Schlüssel sind Aufzählungen, und Sie können sie in einer beliebigen Reihenfolge einfügen. Wenn Sie sie jedoch wiederholen, wird sie in der Aufzählungsreihenfolge (der natürlichen Reihenfolge) wiederholt.
Auch bei der Verwendung von EnumMap sollten keine Kollisionen auftreten, die effizienter sein können.
Ich finde wirklich, dass die Verwendung von enumMap für sauber lesbaren Code sorgt. Hier ist ein Beispiel