W Javie są interfejsy SortedSet
i SortedMap
. Oba należą do środowiska Java Collections i zapewniają uporządkowany sposób dostępu do elementów.
Jednak w moim rozumieniu nie ma SortedList
Java. Możesz użyć java.util.Collections.sort()
do sortowania listy.
Masz pojęcie, dlaczego jest tak zaprojektowany?
java
sorting
collections
Jijoy
źródło
źródło
int diff = this.score - that.score;
return (diff == 0) ? 1 : diff;
Ponieważ jest to śmierdzący hack, podałbym to jako anonimowy argument konstruktora, zamiast mieć jakąkolwiek implementację porównywalną.Odpowiedzi:
Iteratory list gwarantują przede wszystkim, że elementy listy są uporządkowane wewnętrznie (np. Kolejność wstawiania ). Mówiąc dokładniej, jest to w kolejności wstawiania elementów lub sposobu manipulowania listą. Sortowanie może być postrzegane jako manipulacja strukturą danych i istnieje kilka sposobów sortowania listy.
Zamienię sposoby w kolejności użyteczności, tak jak ja to widzę:
1. Zastanów się nad użyciem
Set
lubBag
kolekcjamiUWAGA: Umieszczam tę opcję na górze, ponieważ i tak zwykle chcesz to zrobić.
Posortowany zestaw automatycznie sortuje kolekcję przy wstawianiu , co oznacza, że wykonuje sortowanie podczas dodawania elementów do kolekcji. Oznacza to również, że nie trzeba go ręcznie sortować.
Ponadto, jeśli masz pewność, że nie musisz się martwić (lub mieć) zduplikowanymi elementami, możesz
TreeSet<T>
zamiast tego użyć . ImplementujeSortedSet
iNavigableSet
interfejsy oraz działa tak, jak można się spodziewać po liście:Jeśli nie chcesz naturalnego uporządkowania, możesz użyć parametru konstruktora, który przyjmuje parametr
Comparator<T>
.Alternatywnie możesz użyć Multisets (znanych również jako Torby ) , czyli takich,
Set
które pozwalają na duplikowanie elementów, a są one ich implementacje innych firm. Przede wszystkim z bibliotek Guava istnieje takiTreeMultiset
, który działa podobnie jakTreeSet
.2. Posortuj listę za pomocą
Collections.sort()
Jak wspomniano powyżej, sortowanie
List
s jest manipulacją strukturą danych. Tak więc w sytuacjach, w których potrzebujesz „jednego źródła prawdy”, które zostanie posortowane na różne sposoby, a następnie posortowanie go ręcznie.Możesz posortować listę za pomocą
java.util.Collections.sort()
metody. Oto przykładowy kod:Korzystanie z komparatorów
Jedną z wyraźnych korzyści jest to, że możesz użyć
Comparator
tejsort
metody. Java zapewnia także pewne implementacje dlaComparator
takich,Collator
które są przydatne do łańcuchów sortujących wrażliwych na ustawienia regionalne. Oto jeden przykład:Sortowanie w współbieżnych środowiskach
Należy jednak pamiętać, że użycie tej
sort
metody nie jest przyjazne w środowiskach współbieżnych, ponieważ instancja kolekcji zostanie zmanipulowana, a zamiast tego należy rozważyć użycie niezmiennych kolekcji. Jest to coś, co Guava zapewnia wOrdering
klasie i jest prostym, jedno-liniowym tekstem:3. Zawiń listę
java.util.PriorityQueue
Chociaż w Javie nie ma posortowanej listy, istnieje jednak posortowana kolejka, która prawdopodobnie będzie dla Ciebie równie dobra. To jest
java.util.PriorityQueue
klasa.Nico Haase podał w komentarzach powiązane pytanie, które również na to odpowiada.
W posortowanej kolekcji najprawdopodobniej nie chcesz manipulować wewnętrzną strukturą danych, dlatego PriorityQueue nie implementuje interfejsu List (ponieważ to dałoby ci bezpośredni dostęp do jego elementów).
Zastrzeżenie dotyczące
PriorityQueue
iteratoraDo
PriorityQueue
klasy implementujeIterable<E>
iCollection<E>
interfejsy więc może należy powtórzyć, jak zwykle. Jednak nie ma gwarancji, że iterator zwróci elementy w posortowanej kolejności. Zamiast tego (jak wskazuje Alderath w komentarzach) musisz stać wpoll()
kolejce, aż będzie pusty.Zauważ, że możesz przekonwertować listę do kolejki priorytetowej za pomocą konstruktora, który pobiera dowolną kolekcję :
4. Napisz własną
SortedList
klasęUWAGA: Nie powinieneś tego robić.
Możesz napisać własną klasę List, która będzie sortować za każdym razem, gdy dodasz nowy element. Może to być trudne do obliczeń w zależności od implementacji i jest bezcelowe , chyba że chcesz to zrobić jako ćwiczenie, z dwóch głównych powodów:
List<E>
ma interfejs, ponieważadd
metody powinny zapewnić, że element znajdzie się w indeksie określonym przez użytkownika.Jeśli jednak chcesz to zrobić jako ćwiczenie, tutaj jest próbka kodu na początek, korzysta z
AbstractList
klasy abstrakcyjnej:Zauważ, że jeśli nie przesłoniłeś potrzebnych metod, wówczas domyślne implementacje z
AbstractList
wyrzucąUnsupportedOperationException
s.źródło
Integer maxVal = prioQueue.peek(prioQueue.size() - 1);
. Po drugie, jeśli zamierzasz używać PriorityQueue po prostu jako posortowanej listy,PriorityQueue
w kodzie zabrzmi mniej intuicyjnie niż wSortedList
przypadku, gdyby istniała taka struktura danych.Collections.sort()
pozwala nawet zdefiniować funkcję porównywania używaną do sortowania za pomocąComparator
obiektu.Ponieważ pojęcie listy jest niezgodne z pojęciem kolekcji automatycznie sortowanej. Punktem listy jest to, że po wywołaniu nastąpi powrót
list.add(7, elem)
do połączenia . Dzięki automatycznie posortowanej liście element może znaleźć się w dowolnej pozycji.list.get(7)
elem
źródło
Ponieważ wszystkie listy są już „sortowane” według kolejności, w której elementy zostały dodane (kolejność FIFO), można „zastosować” je w innej kolejności, w tym naturalnej kolejności elementów
java.util.Collections.sort()
.EDYTOWAĆ:
Listy jako struktury danych oparte są na tym, co ciekawe, w kolejności, w której elementy zostały wstawione.
Zestawy nie zawierają tych informacji.
Jeśli chcesz zamówić, dodając czas, użyj
List
. Jeśli chcesz zamówić według innych kryteriów, użyjSortedSet
.źródło
Zestaw i mapa to nieliniowa struktura danych. Lista jest liniową strukturą danych.
Struktura danych drzewa
SortedSet
iSortedMap
interfejsy są implementowaneTreeSet
iTreeMap
odpowiednio używane algorytm implementacji drzewa czerwono-czarnego . Więc upewnij się, że nie ma zduplikowanych elementów (lub kluczy w przypadkuMap
).List
utrzymuje już uporządkowaną kolekcję i strukturę danych opartą na indeksie, drzewa nie są strukturami opartymi na indeksie.Tree
z definicji nie może zawierać duplikatów.List
możemy mieć duplikaty, więc nie maTreeList
(tj. NieSortedList
).java.util.Collections.sort()
. Sortuje określoną listę w porządku rosnącym, zgodnie z naturalnym uporządkowaniem jej elementów.źródło
JavaFX
SortedList
Chociaż zajęło to trochę czasu, Java 8 ma posortowane
List
. http://docs.oracle.com/javase/8/javafx/api/javafx/collections/transformation/SortedList.htmlJak widać w javadocs, jest to część kolekcji JavaFX , która ma zapewnić posortowany widok na ObservableList.
Aktualizacja: należy pamiętać, że w Javie 11 zestaw narzędzi JavaFX został przeniesiony poza JDK i jest teraz osobną biblioteką. JavaFX 11 jest dostępny jako pakiet SDK do pobrania lub z MavenCentral. Zobacz https://openjfx.io
źródło
Dla wszystkich nowych użytkowników, od kwietnia 2015 r., Android ma teraz klasę SortedList w bibliotece pomocy technicznej, zaprojektowaną specjalnie do pracy
RecyclerView
. Oto post na ten temat na blogu .źródło
Kolejnym punktem jest złożoność czasowa operacji wstawiania. W przypadku wstawiania listy oczekuje się złożoności O (1). Nie można tego jednak zagwarantować za pomocą posortowanej listy.
Najważniejsze jest to, że listy nie zakładają niczego o swoich elementach. Na przykład możesz tworzyć listy rzeczy, które nie są implementowane
equals
lubcompare
.źródło
SortedSet
rzeczy, których nie implementujeszComparable
. Zobacz ten konstruktor TreeSet .List
interfejs Java nie gwarantuje żadnych specyfikacji wydajności jego metod.Pomyśl o tym w ten sposób:
List
interfejs ma takie metodyadd(int index, E element)
,set(int index, E element)
. Umowa polega na tym, że po dodaniu elementu w pozycji X znajdziesz go tam, chyba że dodasz lub usuniesz elementy przed nim.Jeśli jakakolwiek implementacja listy przechowałaby elementy w innej kolejności niż na podstawie indeksu, powyższe metody listy nie miałyby sensu.
źródło
Pierwszy wiersz w interfejsie API List mówi, że jest to uporządkowana kolekcja (znana również jako sekwencja). Jeśli posortujesz listę, nie możesz utrzymać kolejności, więc w Javie nie ma TreeList.
Jak mówi API, lista Java została zainspirowana sekwencją i zobacz właściwości sekwencji http://en.wikipedia.org/wiki/Sequence_(mathematics )
Nie oznacza to, że nie można sortować listy, ale Java jest ściśle zgodna z jego definicją i domyślnie nie zapewnia posortowanych wersji list.
źródło
Jeśli szukasz sposobu na sortowanie elementów, ale możesz także uzyskać do nich dostęp za pomocą indeksu w efektywny sposób, możesz wykonać następujące czynności:
ArrayList
)Następnie, aby dodać lub usunąć element, którego możesz użyć
Collections.binarySearch
aby uzyskać indeks wstawiania / usuwania. Ponieważ twoja lista implementuje losowy dostęp, możesz skutecznie modyfikować listę za pomocą określonego indeksu.Przykład:
źródło
Rozważ użycie indeksowanej mapy drzewa . Jest to udoskonalony TreeSet JDK, który zapewnia dostęp do elementu według indeksu i znajdowanie indeksu elementu bez iteracji lub ukrytych bazowych list, które wykonują kopię zapasową drzewa. Algorytm opiera się na aktualizacji wag zmieniających się węzłów za każdym razem, gdy następuje zmiana.
źródło