wake-up-neo.com

Java Klasse, die Map implementiert und die Reihenfolge der Einfügungen beibehält?

Ich suche eine Klasse in Java mit Schlüsselwertzuordnung, aber ohne Verwendung von Hashes. Folgendes mache ich derzeit:

  1. Fügen Sie einem Hashtable Werte hinzu.
  2. Holen Sie sich einen Iterator für die Hashtable.entrySet().
  3. Durchlaufen Sie alle 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 einem JPanel hinzu.
  4. Das Panel anzeigen.

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!

422
Shane

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.

675
Michael Myers

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.

16
jvdneste

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 
16
Praveen Kishor

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.

6
Peter Lawrey

Sie könnten meine Linked Tree Map Implementierung versuchen.

1
Lawrence Dol

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.

1
jpalecek

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:

  1. Es enthält nur einzigartige Elemente.
  2. 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

1
Pankaj Goyal

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

1
j2emanue