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:

  1. Fügen Sie Werte zu einem Hashtable.
  2. Holen Sie sich einen Iterator für die Hashtable.entrySet().
  3. Durchlaufen aller Werte und:
    1. Holen Sie sich ein Map.Entry für den Iterator.
    2. Erstellen Sie ein Objekt vom Typ Module (eine benutzerdefinierte Klasse), basierend auf dem Wert.
    3. Fügen Sie die Klasse zu einem JPanel.
  4. 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!

War es hilfreich?

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.

Leck

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:

  1. Sie enthält onlyunique Elemente.
  2. 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ält
    public 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top