Ich weiß Bescheid SortedSet
, aber in meinem Fall brauche ich etwas, das implementiert wird List
, und nicht Set
. Gibt es da draußen eine Implementierung, in der API oder anderswo?
Es sollte nicht schwer sein, mich selbst zu implementieren, aber ich dachte mir, warum nicht zuerst die Leute hier fragen?
java
list
collections
duplicates
Yuval
quelle
quelle
Antworten:
Es gibt keine Java-Sammlung in der Standardbibliothek, um dies zu tun.
LinkedHashSet<E>
Die Reihenfolge bleibt jedoch ähnlich wie bei a erhalten.List
Wenn Sie also Ihr Set in a einschließen, wenn SieList
es als a verwenden möchten,List
erhalten Sie die gewünschte Semantik.Alternativ haben die Commons-Sammlungen (oder
commons-collections4
für die generische Version) eine, dieList
das tut, was Sie bereits wollen:SetUniqueList
/SetUniqueList<E>
.quelle
Hier ist was ich getan habe und es funktioniert.
Angenommen, ich muss
ArrayList
mit dem ersten arbeiten, was ich getan habe, ist ein neues erstelltLinkedHashMap
.Dann versuche ich mein neues Element zum hinzuzufügen
LinkedHashSet
. Die add-Methode ändert das nichtLinkedHasSet
und gibt false zurück, wenn das neue Element ein Duplikat ist. Dies wird also zu einer Bedingung, die ich testen kann, bevor ich sie hinzufügeArrayList
.Dies ist eine einfache und elegante Methode, um zu verhindern, dass Duplikate zu einer Array-Liste hinzugefügt werden. Wenn Sie möchten, können Sie es in die add-Methode in einer Klasse einkapseln und überschreiben, die das erweitert
ArrayList
. Denken Sie daran,addAll
die Elemente zu durchlaufen und die add-Methode aufzurufen.quelle
Also hier ist, was ich schließlich getan habe. Ich hoffe das hilft jemand anderem.
quelle
Warum kapseln Sie ein Set nicht mit einer Liste? Sortieren Sie wie folgt:
Damit bleibt die andere Implementierung für jemanden, der ein echter Meister der Sammlungen ist ;-)
quelle
Sie sollten ernsthaft über Dhillers Antwort nachdenken:
new ArrayList(set)
(oder einenew LinkedList(set)
, was auch immer) ein.Ich denke, dass die Lösung, die Sie mit veröffentlicht
NoDuplicatesList
haben, einige Probleme hat, hauptsächlich mit dercontains()
Methode, und dass Ihre Klasse nicht nach Duplikaten in der Sammlung sucht, die an IhreaddAll()
Methode übergeben wurde.quelle
Ich brauchte so etwas, also ging ich zu den Commons-Sammlungen und benutzte die
SetUniqueList
, aber als ich einen Leistungstest durchführte, stellte ich fest, dass es im Vergleich zum Fall nicht optimiert zu sein scheint, wenn ich eine verwendenSet
und eineArray
mit derSet.toArray()
Methode erhalten möchte .Das Ausfüllen und anschließende Durchlaufen von 100.000 Strings im Vergleich zur anderen Implementierung
SetUniqueTest
dauerte 20: 1 , was einen großen Unterschied darstellt.Wenn Sie sich also Gedanken über die Leistung machen, empfehle ich Ihnen, Set and Get a Array anstelle von zu verwenden
SetUniqueList
, es sei denn, Sie benötigen wirklich die Logik vonSetUniqueList
, dann müssen Sie andere Lösungen überprüfen ...Hauptmethode zum Testen des Codes :
}}
Grüße, Mohammed Sleem
quelle
HINWEIS: Die Implementierung der Unterliste wird nicht berücksichtigt.
quelle
Die Dokumentation für Sammlungsschnittstellen lautet:
Wenn Sie also keine Duplikate möchten, sollten Sie wahrscheinlich keine Liste verwenden.
quelle
in der
add
Methode, warum nicht verwendenHashSet.add()
, um Duplikate anstelle von zu überprüfenHashSet.consist()
.HashSet.add()
wird zurückgegeben,true
wenn kein Duplikat undfalse
sonst.quelle
HashSet#consist()
?Listen erlauben Duplikate. Sie können a schnell implementieren
UniqueArrayList
und alle zu überprüfendenadd
/insert
Funktionen überschreiben,contains()
bevor Sie die geerbten Methoden aufrufen. Für den persönlichen Gebrauch können Sie die vonadd
Ihnen verwendete Methode nur implementieren und die anderen überschreiben, um eine Ausnahme auszulösen, falls zukünftige Programmierer versuchen, die Liste auf andere Weise zu verwenden.quelle
Ich habe gerade meine eigene UniqueList in meiner eigenen kleinen Bibliothek erstellt:
Ich habe eine TestCollections-Klasse, die so aussieht:
Funktioniert gut. Alles, was es tut, ist, es zu einem Set hinzuzufügen, wenn es es noch nicht hat und es eine Arraylist gibt, die zurückgegeben werden kann, sowie ein Objektarray.
quelle