Behält ein Java-Set die Reihenfolge bei? Eine Methode gibt ein Set an mich zurück und angeblich sind die Daten geordnet, aber wenn sie über das Set iterieren, sind die Daten ungeordnet. Gibt es einen besseren Weg, dies zu verwalten? Muss die Methode geändert werden, um etwas anderes als einen Satz zurückzugeben?
179
Antworten:
Die
Set
Schnittstelle bietet keine Bestellgarantien.Seine Unterschnittstelle
SortedSet
stellt eine Menge dar, die nach einem bestimmten Kriterium sortiert ist. In Java 6 werden zwei Standardcontainer implementiertSortedSet
. Sie sindTreeSet
undConcurrentSkipListSet
.Neben der
SortedSet
Schnittstelle gibt es auch dieLinkedHashSet
Klasse. Es merkt sich die Reihenfolge, in der die Elemente in die Menge eingefügt wurden, und gibt seine Elemente in dieser Reihenfolge zurück.quelle
LinkedHashSet ist das, was Sie brauchen.
quelle
List
ist kein aSet
(es garantiert keine Eindeutigkeit der Mitgliedschaft).Wie viele der Mitglieder vorgeschlagen haben, verwenden Sie LinkedHashSet , um die Reihenfolge der Sammlung beizubehalten. Mit dieser Implementierung können Sie Ihr Set verpacken.
Die SortedSet- Implementierung kann für die sortierte Reihenfolge verwendet werden, verwenden Sie jedoch für Ihren Zweck LinkedHashSet .
Auch aus den Dokumenten,
"Diese Implementierung erspart ihren Kunden die nicht spezifizierte, im Allgemeinen chaotische Reihenfolge, die von HashSet bereitgestellt wird, ohne die mit TreeSet verbundenen erhöhten Kosten zu verursachen. Sie kann verwendet werden, um eine Kopie eines Satzes zu erstellen, der unabhängig vom Original dieselbe Reihenfolge wie das Original hat Implementierung des Sets: "
Quelle: http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html
quelle
Set ist nur eine Schnittstelle. Um die Reihenfolge beizubehalten, müssen Sie eine bestimmte Implementierung dieser Schnittstelle und der Unterschnittstelle SortedSet verwenden, z. B. TreeSet oder LinkedHashSet. Sie können Ihr Set folgendermaßen verpacken:
quelle
Hier ist eine kurze Zusammenfassung der Auftragseigenschaften der
Set
in Java verfügbaren Standardimplementierungen :Für Ihren speziellen Fall können Sie entweder zuerst die Elemente sortieren und dann eine von 1 oder 2 verwenden (höchstwahrscheinlich
LinkedHashSet
oderTreeSet
). Alternativ oder effizienter können Sie einfach unsortierte Daten zu einem hinzufügen,TreeSet
das die Sortierung automatisch für Sie übernimmt.quelle
Um die Bestellung beizubehalten, verwenden Sie
List
oder aLinkedHashSet
.quelle
LinkedHashSet
nicht ...Map
.Ein LinkedHashSet ist eine geordnete Version von HashSet, die eine doppelt verknüpfte Liste über alle Elemente hinweg verwaltet. Verwenden Sie diese Klasse anstelle von HashSet, wenn Sie sich für die Iterationsreihenfolge interessieren.
quelle
Aus dem Javadoc für
Set.iterator()
:Und wie bereits von Shuuchan festgestellt ,
TreeSet
ist a eine ImplementierungSet
, die eine garantierte Reihenfolge hat:quelle
Normalerweise behält set die Reihenfolge nicht bei, wie z. B. HashSet, um schnell ein Emelent zu finden. Sie können jedoch versuchen, LinkedHashSet zu verwenden, damit die von Ihnen eingegebene Reihenfolge beibehalten wird.
quelle
Es gibt 2 verschiedene Dinge.
quelle
Die Set-Schnittstelle selbst legt keine bestimmte Reihenfolge fest. Das SortedSet tut dies jedoch.
quelle
Von Set zurückgegebener Iterator soll keine Daten in geordneter Weise zurückgeben. Siehe diese beiden java.util.Iteratoren derselben Auflistung: Müssen sie Elemente in derselben Reihenfolge zurückgeben?
quelle
Nur
SortedSet
kann die Bestellung derSet
quelle