Java-Klasse, die Karte und hält Auftrag implementiert?
-
22-08-2019 - |
Frage
Ich bin für eine Klasse in Java, die Schlüssel-Wert-Verein hat, aber ohne Hashes zu verwenden. Hier ist, was ich gerade tun:
- Fügen Sie Werte zu einem
Hashtable
. - Holen Sie sich einen Iterator für die
Hashtable.entrySet()
. - Durchlaufen aller 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 zu einem JPanel.
- Holen Sie sich ein
- Zeigen Sie das Panel.
Das Problem dabei ist, dass ich nicht die Kontrolle über den Auftrag haben, tun, dass ich die Werte zurück, so kann ich die Werte in der einer bestimmten Reihenfolge nicht angezeigt werden (ohne Hartcodierung der Reihenfolge).
Ich würde ein ArrayList
oder Vector
für diese, aber später im Code Ich brauche das Module
Objekt für einen bestimmten Schlüssel zu greifen, die ich mit einem ArrayList
oder Vector
nicht tun können.
Kennt jemand eine freien / Open-Source-Java-Klasse, die dies tun wird, oder ein Weg, um Werte aus einer Hashtable
zu erhalten, basierend auf, wenn sie hinzugefügt wurden?
Danke!
Lösung
Ich schlage vor, einen LinkedHashMap
oder ein TreeMap
. A LinkedHashMap
hält den Schlüssel in der Reihenfolge, wie sie eingesetzt wurden, während ein TreeMap
wird über eine Comparator
oder die natürliche Comparable
Sortierung der Elemente sortiert gehalten.
Da es nicht die Elemente sortiert zu halten hat, sollte LinkedHashMap
schneller sein für die meisten Fälle; TreeMap
hat O(log n)
Leistung für containsKey
, get
, put
und remove
nach dem Javadocs, während LinkedHashMap
O(1)
für jeden ist.
Wenn Ihr API, die nur erwartet eine vorhersagbare Art Ordnung, im Gegensatz zu einer bestimmten Sortierreihenfolge, sollten Sie die Schnittstellen dieser beiden Klassen implementieren, NavigableMap
oder SortedMap
. Dies ermöglicht es Ihnen nicht spezifische Implementierungen in Ihr API und wechseln Sie zu einem dieser speziellen Klassen oder eine völlig anderen Implementierung nach Belieben danach.
Andere Tipps
LinkedHashMap werden die Elemente in der Reihenfolge kehren sie in die Karte eingefügt wurden, wenn Sie über die keySet iterieren (), entrySet () oder Werte () auf der Karte.
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());
}
Damit werden die Elemente in der Reihenfolge drucken sie in die Karte gesetzt wurden:
id = 1
name = rohan
age = 26
Wenn ein unveränderliches Karte Ihren Bedürfnissen entspricht , dann gibt es eine Bibliothek von Google namens Guave (siehe auch Guave Fragen )
Guava bietet eine ImmutableMap mit zuverlässigen Benutzer angegebenen Iterationsreihenfolge. Diese ImmutableMap O (1) Leistung für containsKey hat, erhalten. Offensichtlich setzen und zu entfernen, werden nicht unterstützt.
ImmutableMap Objekte werden, indem entweder die eleganten statischen Methoden verwendet von () und copyOf () oder ein Builder Objekt.
Sie können eine Map
halten (für schnelles Nachschlagen) und List
(für Bestellung), sondern ein LinkedHashMap
kann die einfachste sein. Sie können auch versuchen, eine SortedMap
z.B. TreeMap
, die eine beliebige Reihenfolge haben Sie angeben.
Ich weiß nicht, ob es Open Source ist, aber nach ein wenig googeln, fand ich diese Implementierung von Karte Arraylist verwenden. Es scheint, Pre-1.5 zu Java, so dass Sie vielleicht wollen es genericize, die einfach sein sollte. Beachten Sie, dass diese Implementierung O (N) Zugriff hat, aber das sollte kein Problem sein, wenn Sie nicht hinzufügen Hunderte von Widgets zu Ihrem JPanel, die sollte man sowieso nicht.
Sie könnten meine verlinkte Treemap Implementierung versuchen.
Jedes Mal, wenn ich brauche, um die natürliche Ordnung der Dinge zu halten, die vor der Zeit bekannt sind, verwende ich ein EnumMap
werden die Tasten Aufzählungen sein, und Sie können in jeder gewünschten Reihenfolge einfügen, aber wenn man iterieren wird es in der Aufzählungsreihenfolge (die natürliche Ordnung) durchlaufen.
Auch bei der Verwendung von EnumMap sollte es keine Kollisionen sein, die effizienter sein kann.
ich wirklich feststellen, dass mit enumMap für sauberen lesbaren Code macht. Hier ist ein Beispiel
Sie können verwenden LinkedHashMap zum Hauptauftrag in Karte
Die wichtige Punkte über Java LinkedHashMap Klasse sind:
- Sie enthält onlyunique Elemente.
-
A LinkedHashMap enthält Werte, basierend auf dem Schlüssel 3.It kann ein Null-Schlüssel und mehrere Nullwerte haben. 4.It ist die gleiche wie HashMap anstelle Auftrag
hältpublic class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
Aber wenn Sie in der Karte unter Verwendung von benutzerdefinierten Objekt oder jede primitive Datentyp Schlüssel sortieren Werte wollen, dann sollten Sie verwenden TreeMap Weitere Informationen finden Sie Link