Ich versuche eine Implementierung von java.util.List
und java.util.Set
gleichzeitig in Java zu finden. Ich möchte, dass diese Klasse nur eindeutige Elemente (as Set
) zulässt und deren Reihenfolge (like List
) beibehält . Existiert es in JDK 6?
Es ist wichtig zu haben, List<T>#add(int, T)
damit ich in eine bestimmte Position einfügen kann.
java
collections
yegor256
quelle
quelle
Comparator
? Möchten Sie auch die Semantik derList
Schnittstelle?Antworten:
TreeSet
ist nach Elementreihenfolge sortiert;LinkedHashSet
behält die Einfügereihenfolge bei. Hoffentlich war eines davon das, wonach Sie gesucht haben.Sie haben angegeben, dass Sie an einer beliebigen Stelle einfügen möchten. Ich vermute, Sie müssen Ihre eigene schreiben. Erstellen Sie einfach eine Klasse mit a
HashSet<T>
und aArrayList<T>
. Überprüfen Sie beim Hinzufügen eines Elements, ob es im Set enthalten ist, bevor Sie es zur Liste hinzufügen.Alternativ Apache commons-collections4 Angebote
ListOrderedSet
undSetUniqueList
, die sich ähnlich verhalten und sollte die gegebenen Anforderungen erfüllen.quelle
LinkedHashSet ist die Antwort.
Iterationsreihenfolge und Einzigartigkeit.
http://download.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html
quelle
List
Schnittstelle, siehe meine Änderungen an der FrageMeinst du wie
LinkedHashSet
? Dadurch bleibt die Reihenfolge der Eingabe erhalten, es werden jedoch keine Duplikate zugelassen.IMHO, es ist eine ungewöhnliche Anforderung, aber Sie können eine Liste ohne Duplikate schreiben.
quelle
List
Schnittstelle, siehe meine Änderungen an der FrageO(n)
gibt einen Kompromiss zwischen doppeltem Speicher undO(log(n))
Einfügevorgang.Sie können nicht implementieren
List
undSet
sofort ohne Vertragsverletzung. Siehe zum Beispiel denSet.hashCode
Vertrag:Auf der anderen Seite ist hier der Vertrag von
List.hashCode
:Es ist daher unmöglich, eine einzelne Klasse zu implementieren, die die Erfüllung beider Verträge garantiert. Das gleiche Problem bei der
equals
Implementierung.quelle
Wenn Sie sich nicht auf JDK 6 beschränken möchten, können Sie die allgemeine Apache-Sammlungsbibliothek verwenden, die genau Ihren Anforderungen entspricht - ListOrderedSet . Es ist wie
List
und zusammenSet
kombiniert :)quelle
List
SchnittstelleIch hatte ein ähnliches Problem, also schrieb ich mein eigenes. Siehe hier . Das
IndexedArraySet
erweitertArrayList
und implementiertSet
, sollte also alle Operationen unterstützen, die Sie benötigen. Beachten Sie, dass das Einfügen von Elementen in Positionen in der Mitte vonArrayList
für große Listen langsam sein kann, da alle folgenden Elemente verschoben werden müssen. DasIndexedArraySet
ändert ich nicht.quelle
Eine weitere Option (abzüglich der
List
Schnittstellenanforderungen) ist die von GuavaImmutableSet
, bei der die Einfügereihenfolge beibehalten wird. Von ihrer Wiki-Seite :quelle