613 Stimmen

Java-Klasse, die Map implementiert und die Einfügereihenfolge beibehält?

Ich bin auf der Suche nach einer Klasse in Java, die Schlüssel-Wert-Zuordnung hat, aber ohne Hashes zu verwenden. Hier ist, was ich derzeit tun:

  1. Hinzufügen von Werten zu einer Hashtable .
  2. Holt einen Iterator für die Hashtable.entrySet() .
  3. Iterieren Sie durch alle Werte und:
    1. Erhalten Sie eine Map.Entry für den Iterator.
    2. Erstellen Sie ein Objekt vom Typ Module (eine benutzerdefinierte Klasse) auf der Grundlage des Wertes.
    3. Fügen Sie die Klasse zu einem JPanel hinzu.
  4. Zeigen Sie das Panel an.

Das Problem dabei ist, dass ich keine Kontrolle über die Reihenfolge habe, in der ich die Werte zurückerhalte, so dass ich die Werte nicht in einer bestimmten Reihenfolge anzeigen kann (ohne die Reihenfolge hart zu kodieren).

Ich würde eine ArrayList o Vector dafür, aber später im Code muss ich die Module Objekt für einen bestimmten Schlüssel, was ich nicht mit einer ArrayList o Vector .

Kennt jemand eine freie/offene Java-Klasse, die dies tut, oder eine Möglichkeit, Werte aus einer Hashtable je nachdem, wann sie hinzugefügt wurden?

Gracias.

920voto

Michael Myers Punkte 183216

Ich schlage eine LinkedHashMap oder eine TreeMap . A LinkedHashMap behält die Schlüssel in der Reihenfolge, in der sie eingefügt wurden, während ein TreeMap wird sortiert gehalten über eine Comparator oder die natürliche Comparable Anordnung der Elemente.

Da es die Elemente nicht sortiert halten muss, LinkedHashMap sollte in den meisten Fällen schneller sein; TreeMap a O(log n) Leistung für containsKey , get , put y remove laut den Javadocs, während LinkedHashMap es O(1) für jeden.

Wenn Ihre API nur eine vorhersehbare Sortierreihenfolge erwartet, im Gegensatz zu einer bestimmten Sortierreihenfolge, sollten Sie die Schnittstellen verwenden, die diese beiden Klassen implementieren, NavigableMap o SortedMap . Dadurch können Sie bestimmte Implementierungen nicht in Ihre API einfließen lassen und anschließend nach Belieben entweder zu diesen spezifischen Klassen oder zu einer völlig anderen Implementierung wechseln.

63voto

Praveen Kishor Punkte 2103

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.

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

20voto

jvdneste Punkte 1617

Wenn eine unveränderliche Karte Ihren Anforderungen entspricht dann gibt es eine Bibliothek von Google namens Guave (siehe auch Fragen zur Guave )

Guave bietet eine ImmutableMap mit zuverlässiger, vom Benutzer festgelegter Iterationsreihenfolge. Diese ImmutableMap hat O(1) Leistung für containsKey, get. Offensichtlich werden put und remove nicht unterstützt.

ImmutableMap Objekte werden entweder mit den eleganten statischen Komfortmethoden von() y copyOf() oder eine Bauherr Objekt.

8voto

Pankaj Goyal Punkte 61

Sie können verwenden LinkedHashMap zur Haupteinfügereihenfolge in Map

Die wichtigsten Punkte über die Java LinkedHashMap Klasse sind:

  1. Sie enthält nur eindeutige Elemente.

  2. Eine LinkedHashMap enthält Werte, die auf dem Schlüssel basieren.

  3. Sie kann einen Nullschlüssel und mehrere Nullwerte haben.

  4. Es ist dasselbe wie HashMap, behält aber die Einfügereihenfolge bei

    public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> 

Wenn Sie jedoch Werte in der Karte mit Hilfe eines benutzerdefinierten Objekts oder eines primitiven Datentyps sortieren möchten, sollten Sie TreeMap Weitere Informationen finden Sie unter ce lien

6voto

Peter Lawrey Punkte 511323

Sie können eine Map (für schnelles Nachschlagen) und List (für Ordnung), sondern ein LinkedHashMap kann die einfachste sein. Sie können auch versuchen, eine SortedMap z.B.. TreeMap die eine beliebige Reihenfolge haben können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X