Ich suche nach einer Klasse in Java, die eine Schlüsselwertzuordnung hat, aber keine Hashes verwendet. Folgendes mache ich gerade:
- Hinzufügen von Werten zu a
Hashtable
. - Holen Sie sich einen Iterator für die
Hashtable.entrySet()
. - Durchlaufen Sie alle Werte und:
- Holen Sie sich ein
Map.Entry
für den Iterator. - Erstellen Sie ein Objekt vom Typ
Module
(eine benutzerdefinierte Klasse) basierend auf dem Wert. - Fügen Sie die Klasse einem JPanel hinzu.
- Holen Sie sich ein
- Zeigen Sie das Panel.
Das Problem dabei ist, dass ich keine Kontrolle über die Reihenfolge habe, in der ich die Werte zurückerhalte, sodass ich die Werte in einer bestimmten Reihenfolge nicht anzeigen kann (ohne die Reihenfolge fest zu codieren).
Ich würde ein ArrayList
oder Vector
dafür verwenden, aber später im Code muss ich das Module
Objekt für einen bestimmten Schlüssel abrufen, was ich mit einem ArrayList
oder nicht tun kann Vector
.
Kennt jemand eine Free / Open-Source-Java-Klasse, die dies tut, oder eine Möglichkeit, Werte aus einer Klasse zu ermitteln, die darauf Hashtable
basiert, wann sie hinzugefügt wurden?
Vielen Dank!
java
dictionary
key-value
Shane
quelle
quelle
Antworten:
Ich schlage ein
LinkedHashMap
oder einTreeMap
. ALinkedHashMap
hält die Schlüssel in der Reihenfolge, in der sie eingefügt wurden, während aTreeMap
über aComparator
oder die natürlicheComparable
Reihenfolge der Elemente sortiert bleibt .Da die Elemente nicht sortiert bleiben müssen,
LinkedHashMap
sollte es in den meisten Fällen schneller sein.TreeMap
hatO(log n)
Leistung fürcontainsKey
,get
,put
, undremove
, nach dem Javadocs, währendLinkedHashMap
istO(1)
für jeden.Wenn Ihre API im Gegensatz zu einer bestimmten Sortierreihenfolge nur eine vorhersehbare Sortierreihenfolge erwartet, sollten Sie die von diesen beiden Klassen implementierten Schnittstellen verwenden,
NavigableMap
oderSortedMap
. Auf diese Weise können Sie keine bestimmten Implementierungen in Ihre API verlieren und anschließend nach Belieben zu einer dieser spezifischen Klassen oder zu einer völlig anderen Implementierung wechseln.quelle
LinkedHashMap gibt die Elemente in der Reihenfolge zurück, in der sie in die Map eingefügt wurden, wenn Sie über keySet (), entrySet () oder values () der Map iterieren.
Dadurch werden die Elemente in der Reihenfolge gedruckt, in der sie in die Karte eingefügt wurden:
quelle
Wenn eine unveränderliche Karte Ihren Anforderungen entspricht, gibt es eine Bibliothek von Google namens Guave (siehe auch Guavenfragen ).
Guava bietet eine ImmutableMap mit zuverlässiger benutzerdefinierter Iterationsreihenfolge. Diese ImmutableMap hat O (1) -Leistung für enthältKey, get. Offensichtlich werden Put und Remove nicht unterstützt.
ImmutableMap- Objekte werden mithilfe der eleganten statischen Komfortmethoden von () und copyOf () oder eines Builder- Objekts erstellt.
quelle
Sie können a
Map
(zur schnellen Suche) undList
(zur Bestellung) pflegen , aber a istLinkedHashMap
möglicherweise die einfachste. Sie können auch einSortedMap
Beispiel ausprobierenTreeMap
, das eine beliebige Reihenfolge hat, die Sie angeben.quelle
Ich weiß nicht, ob es Open Source ist, aber nach ein wenig googeln habe ich diese Implementierung von Map mithilfe von ArrayList gefunden . Es scheint Java vor 1.5 zu sein, daher möchten Sie es möglicherweise generisieren, was einfach sein sollte. Beachten Sie, dass diese Implementierung über O (N) -Zugriff verfügt. Dies sollte jedoch kein Problem sein, wenn Sie Ihrem JPanel nicht Hunderte von Widgets hinzufügen, was Sie sowieso nicht tun sollten.
quelle
Sie können meine Linked Tree Map- Implementierung ausprobieren .
quelle
Wann immer ich die natürliche Reihenfolge der Dinge beibehalten muss, die im Voraus bekannt sind, verwende ich eine EnumMap
Die Schlüssel sind Aufzählungen und Sie können sie in beliebiger Reihenfolge einfügen. Wenn Sie sie jedoch wiederholen, wird sie in der Aufzählungsreihenfolge (der natürlichen Reihenfolge) wiederholt.
Auch bei 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
quelle
Sie können LinkedHashMap verwenden, um die Einfügereihenfolge in Map zu bestimmen
Die wichtigen Punkte der 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, stattdessen wird die Einfügereihenfolge beibehalten
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 diesem Link
quelle
Entweder können
LinkedHashMap<K, V>
Sie eine eigene CustomMap verwenden oder implementieren, die die Einfügereihenfolge beibehält.Sie können Folgendes
CustomHashMap
mit den folgenden Funktionen verwenden:null
oder leere Zeichenfolgen sind nicht zulässig.HashMap
vsLinkedHashMap
vsCustomHashMap
Verwendung von
CustomHashMap
:O / P:
Wenn Sie wissen, dass die KEYs behoben sind, können Sie EnumMap verwenden. Rufen Sie die Werte aus Eigenschaften / XML-Dateien ab
EX:
quelle