Czy zestaw Java zachowuje kolejność? Metoda zwraca do mnie zestaw i przypuszczalnie dane są uporządkowane, ale iterując po zestawie, dane są nieuporządkowane. Czy jest lepszy sposób, aby to zrobić? Czy należy zmienić metodę, aby zwrócić coś innego niż zestaw?
179
Odpowiedzi:
Set
Interfejs nie udziela żadnych gwarancji zamówieniu.Jego interfejs podrzędny
SortedSet
reprezentuje zestaw posortowany według pewnego kryterium. W Javie 6 są dwa standardowe kontenery, które implementująSortedSet
. SąTreeSet
iConcurrentSkipListSet
.Oprócz
SortedSet
interfejsu jest teżLinkedHashSet
klasa. Zapamiętuje kolejność, w jakiej elementy zostały wstawione do zestawu i zwraca jego elementy w tej kolejności.źródło
LinkedHashSet jest tym, czego potrzebujesz.
źródło
List
nie jestSet
(nie gwarantuje to niepowtarzalności członkostwa).Jak wielu członków sugerowało, użyj LinkedHashSet, aby zachować kolejność kolekcji. Możesz opakować swój zestaw za pomocą tej implementacji.
Implementacja SortedSet może służyć do sortowania kolejności, ale w tym celu użyj LinkedHashSet .
Również z dokumentacji,
„Ta implementacja oszczędza klientom nieokreślonego, generalnie chaotycznego porządkowania zapewnianego przez HashSet, bez ponoszenia zwiększonych kosztów związanych z TreeSet. Może być wykorzystana do stworzenia kopii zestawu, który ma taką samą kolejność jak oryginał, niezależnie od oryginału wykonanie zestawu: „
Źródło: http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html
źródło
Zestaw to tylko interfejs. Aby zachować porządek, musisz użyć określonej implementacji tego interfejsu i podinterfejsu SortedSet, na przykład TreeSet lub LinkedHashSet. Możesz opakować swój zestaw w ten sposób:
źródło
Oto krótkie podsumowanie charakterystyki kolejności standardowych
Set
implementacji dostępnych w Javie:W swoim konkretnym przypadku możesz najpierw posortować elementy, a następnie użyć jednego z 1 lub 2 (najprawdopodobniej
LinkedHashSet
lubTreeSet
). Lub alternatywnie i wydajniej , możesz po prostu dodać nieposortowane dane do pliku,TreeSet
który automatycznie zajmie się sortowaniem.źródło
Aby zachować zamówienie, użyj
List
lub aLinkedHashSet
.źródło
LinkedHashSet
nie ...Map
.LinkedHashSet to uporządkowana wersja HashSet, która utrzymuje podwójnie połączoną listę wszystkich elementów. Użyj tej klasy zamiast HashSet, jeśli zależy Ci na kolejności iteracji.
źródło
Z javadoc dla
Set.iterator()
:I, jak już powiedział shuuchan , a
TreeSet
jest implementacją,Set
która ma gwarantowaną kolejność:źródło
Zwykle set nie zachowuje kolejności, takiej jak HashSet, aby szybko znaleźć emelent, ale możesz wypróbować LinkedHashSet, który zachowa kolejność, którą złożyłeś.
źródło
Są 2 różne rzeczy.
źródło
Sam interfejs Set nie określa żadnej konkretnej kolejności. Jednak SortedSet .
źródło
Iterator zwracany przez Set nie powinien zwracać danych w sposób uporządkowany. Zobacz to Dwa java.util.Iteratory do tej samej kolekcji: czy muszą zwracać elementy w tej samej kolejności?
źródło
Tylko
SortedSet
może zrobić porządek zSet
źródło