Sammlung ohne Duplikate und in zufälliger Reihenfolge in Java
Wie es aussieht, kann ich nicht verwenden Sie entweder eine ArrayList, noch ein Satz:
-
Set<>
- Ich kann vermeiden Sie Duplikate mit einem Satz, aber kein shuffle-option //Collections.shuffle(List<?> list)
-
ArrayList<>
- Ich kann shuffle zu randomise der Liste, aber Duplikate erlaubt sind.
Könnte ich mit einem Set
und konvertieren diese in eine ArrayList
(oder Umgekehrt), um die Duplikate. Alternativ, loop-through-set randomise der Elemente. Aber ich bin auf der Suche nach etwas effizienter.
- Man könnte prüfen, ob das Element bereits in der ArrayList, bevor Sie es: myList.enthält(myItem); Diese überprüfung sollte nur O(n).
- etwas effizienter > sagen Sie so, weil Sie (a) es versucht, und (b) geschlossen haben, durch geeignete benchmarking, dass dies ist ein erheblicher Engpass in Ihrer Anwendung? Wenn nicht, nicht vorzeitig optimieren und zu schreiben, je nachdem, welche version liest die meisten klar (wahrscheinlich konvertieren arraylist).
InformationsquelleAutor BLuEGoD | 2013-02-15
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie warten zwei separate Kollektionen, eine
ArrayList
und einHashSet
, und lehnen insertion von einer Sache, die in derHashSet
.Wenn Sie besorgt sind, mit Kapselung, wickeln Sie die zwei Sammlungen in ein meta-Objekt, implementiert
List
und sorgfältig dokumentieren, dass die Insertionen der doppelten Elemente werden abgelehnt, auch wenn die Allgemeinen Vertrags vonList
nicht vorschreiben, so.Reden über die Kosten dieser Lösung, ich glaube, dass in Bezug auf die Zeit, die Kosten wären absolut vernachlässigbar ist im Vergleich zu einem einfachen
ArrayList
: die meisten Operationen aufHashSet
s Kosten amortisiert O(1), nämlich-lookup und insertion. Auf der anderen Seite, können Sie Ihre Speichernutzung wird zweimal (oder mehr, je nachHashSet
Auslastung).Collections.shuffle()
auf die proprietärenSet
Umsetzung.Soweit ich weiß setzt nicht bestellt, so ist Sie offensichtlich nicht mische Elemente von Mengen. Für das entfernen von Duplikaten aus einer Liste fand ich dies: Wie Entferne ich wiederholt Elemente aus ArrayList?.
Mit der geringsten Menge an code und die meisten die Eleganz, die Sie tun können, so etwas wie:
Aber das ist nicht sehr effektiv, Sie könnte verwenden Sie ein array und eine hash-Funktion, um die Elemente in die gewünschte Stelle auf dem array, und prüfen Sie dann, wenn Sie bereits da sind, bevor Sie diese, dies funktioniert in O(n) Zeit, so ist es sehr gut, aber braucht ein wenig mehr code und einige Aufmerksamkeit auf die hash-Funktion.
Könnte man tatsächlich eine "geordnete Menge", z.B. TreeSet. Um einer zufälligen Reihenfolge, nicht legen Sie das eigentliche Element, sondern ein wrapper, mit einigen zufälligen Gewicht und verwenden Sie einen entsprechenden Komparator. Neu-Ordnung jedoch würde erfordern, aktualisieren alle wrapper-GEWICHTE.