Jestem początkującym w Javie. Proszę zasugerować, które kolekcje mogą / powinny być używane do utrzymywania posortowanej listy w Javie. Próbowałem Map
i Set
, ale nie były tym, czego szukałem.
źródło
Jestem początkującym w Javie. Proszę zasugerować, które kolekcje mogą / powinny być używane do utrzymywania posortowanej listy w Javie. Próbowałem Map
i Set
, ale nie były tym, czego szukałem.
Dzieje się to bardzo późno, ale w JDK znajduje się klasa, której celem jest posortowana lista. Nazywa się (nieco poza kolejnością z innymi Sorted*
interfejsami) „ java.util.PriorityQueue
”. Może sortować Comparable<?>
s lub używając pliku Comparator
.
Różnica w stosunku do List
posortowanego użycia Collections.sort(...)
polega na tym, że będzie to utrzymywać częściową kolejność przez cały czas, z wydajnością wstawiania O (log (n)), przy użyciu struktury danych sterty, podczas gdy wstawianie posortowane ArrayList
będzie miało wartość O (n) (tj. za pomocą wyszukiwania binarnego i przenoszenia).
Jednak w przeciwieństwie do a List
, PriorityQueue
nie obsługuje indeksowanego access ( get(5)
), jedynym sposobem uzyskania dostępu do elementów w stercie jest wyjęcie ich pojedynczo (stąd nazwa PriorityQueue
).
TreeMap i TreeSet zapewnią iterację po zawartości w posortowanej kolejności. Lub możesz użyć ArrayList i użyć Collections.sort () do sortowania. Wszystkie te klasy znajdują się w java.util
źródło
Jeśli chcesz zachować posortowaną listę, którą będziesz często modyfikować (tj. Strukturę, która oprócz tego, że jest posortowana, pozwala na duplikaty i której elementy można skutecznie odwoływać się za pomocą indeksu), użyj ArrayList, ale gdy musisz wstawić element , zawsze używaj Collections.binarySearch () do określenia indeksu, w którym dodajesz dany element. Druga metoda określa indeks, w którym należy wstawić listę, aby zachować posortowaną listę.
źródło
Użyj klasy TreeMultiset Google Guava . Guava ma spektakularne API kolekcji.
Jednym z problemów związanych z zapewnieniem implementacji List, która utrzymuje posortowaną kolejność, jest obietnica złożona w JavaDocs
add()
metody.źródło
List
zawsze dodaje na końcu.Chcesz implementacji SortedSet , a mianowicie TreeSet .
źródło
Jest kilka opcji. Sugerowałbym TreeSet, jeśli nie chcesz duplikatów, a wstawiane obiekty są porównywalne.
W tym celu można również użyć statycznych metod klasy Collections.
Aby uzyskać więcej informacji, zobacz Kolekcje # sort (java.util.List) i TreeSet .
źródło
Jeśli chcesz tylko posortować listę, użyj dowolnego rodzaju listy i użyj kolekcji.sort () . Jeśli chcesz mieć pewność, że elementy na liście są unikalne i zawsze posortowane, użyj SortedSet .
źródło
To, co zrobiłem, to zaimplementowanie List z wewnętrzną instancją z delegowanymi wszystkimi metodami.
Następnie zaimplementowałem nową metodę "putOrdered", która wstawia we właściwej pozycji, jeśli element nie istnieje lub zamienia na wypadek, gdyby istniał.
Jeśli chcesz zezwolić na powtarzające się elementy, po prostu zaimplementuj addOrdered (lub oba).
Jeśli chcesz uniknąć operacji wstawiania, możesz również zgłosić wyjątek dotyczący nieobsługiwanej operacji dla metod „add” i „set”.
... a także musisz uważać na metody ListIterator, ponieważ mogą one modyfikować Twoją listę wewnętrzną. W takim przypadku możesz zwrócić kopię listy wewnętrznej lub ponownie zgłosić wyjątek.
źródło
List
umowę. Może lepiej byłoby tylko wdrożyćCollection
. A jeśliContactList
jest posortowany,contains()
można go również zaimplementować za pomocą,binarySearch
aby był bardziej wydajny.Najbardziej wydajnym sposobem zaimplementowania posortowanej listy, tak jak chcesz, byłoby zaimplementowanie indeksowalnej listy pominięć, jak tutaj: Wikipedia: Indeksowalna lista pomijana . Pozwoliłoby to na wstawianie / usuwanie w O (log (n)) i pozwoliłoby na indeksowany dostęp w tym samym czasie. Pozwoliłoby to również na duplikaty.
Skiplist jest dość interesującą i, powiedziałbym, niedocenianą strukturą danych. Niestety nie ma implementacji indeksowanej listy pominięć w podstawowej bibliotece Java, ale możesz użyć jednej z implementacji open source lub zaimplementować ją samodzielnie. Istnieją regularne implementacje Skiplist, takie jak ConcurrentSkipListSet i ConcurrentSkipListMap
źródło
TreeSet nie zadziała, ponieważ nie zezwalają na duplikaty oraz nie zapewniają metody pobierania elementu z określonej pozycji. PriorityQueue nie zadziała, ponieważ nie pozwala na pobieranie elementów z określonej pozycji, co jest podstawowym wymaganiem dla listy. Myślę, że musisz zaimplementować własny algorytm, aby utrzymać posortowaną listę w Javie z czasem wstawiania O (logn), chyba że nie potrzebujesz duplikatów. Może rozwiązaniem mogłoby być użycie TreeMap, w której klucz jest podklasą elementu, przesłaniając metodę equals, tak aby możliwe były duplikaty.
źródło
Korzystanie z LambdaJ
Możesz spróbować rozwiązać te zadania za pomocą LambdaJ, jeśli używasz wcześniejszych wersji java 8. Możesz je znaleźć tutaj: http://code.google.com/p/lambdaj/
Tutaj masz przykład:
Sortuj iteracyjnie
Sortuj według LambdaJ
Oczywiście posiadanie tego rodzaju piękna wpływa na wydajność (średnio 2 razy), ale czy możesz znaleźć bardziej czytelny kod?
Sortuj według java 8, używając wyrażenia lambda
źródło
-(p1.getAge().compareTo(p2.getAge()))
Problem z PriorityQueue polega na tym, że jest on zabezpieczony prostą tablicą, a logika, która pobiera elementy w kolejności, jest wykonywana przez „queue [2 * n + 1] i queue [2 * (n + 1)]”. Działa świetnie, jeśli po prostu pociągniesz od głowy, ale czyni to bezużytecznym, jeśli w pewnym momencie próbujesz wywołać na nim .toArray.
Omawiam ten problem, używając com.google.common.collect.TreeMultimap, ale dla wartości dostarczam niestandardowy komparator, zawarty w kolejności, która nigdy nie zwraca 0.
dawny. dla Double:
W ten sposób otrzymuję wartości w kolejności, gdy wywołuję .toArray (), a także mam duplikaty.
źródło
To, czego chcesz, to binarne drzewo wyszukiwania. Utrzymuje posortowaną kolejność, oferując logarytmiczny dostęp do wyszukiwania, usuwania i wstawiania (chyba że masz zdegenerowane drzewo - wtedy jest liniowe). Jest dość łatwy do zaimplementowania, a nawet można go zaimplementować interfejs List, ale wtedy dostęp do indeksu staje się skomplikowany.
Drugie podejście polega na zastosowaniu ArrayList, a następnie implementacji sortowania bąbelkowego. Ponieważ wstawiasz lub usuwasz jeden element na raz, czasy dostępu do wstawiania i usuwania są liniowe. Wyszukiwania są logarytmiczne i mają stałą dostępu do indeksu (czasy mogą być różne dla LinkedList). Jedyny potrzebny kod to 5, może 6 wierszy sortowania bąbelkowego.
źródło
Możesz używać Arraylist i Treemap, ponieważ powiedziałeś, że chcesz również powtarzać wartości, nie możesz użyć TreeSet, chociaż jest on również posortowany, ale musisz zdefiniować komparator.
źródło
W zestawie możesz użyć TreeSet. TreeSet porządkuje swoje elementy na podstawie naturalnego porządku lub dowolnej kolejności sortowania przekazanej do Porównywalnego dla tego konkretnego obiektu. Do mapy użyj TreeMap. TreeMap zapewnia sortowanie według kluczy. Aby dodać obiekt jako klucz do TreeMap, ta klasa powinna implementować porównywalny interfejs, który z kolei wymusza implementację metody compare to (), która zawiera definicję kolejności sortowania. http://techmastertutorial.in/java-collection-impl.html
źródło
Użyj metody sort (), aby posortować listę jak poniżej:
W celach informacyjnych zobacz link: http://tutorials.jenkov.com/java-collections/sorting.html
źródło
Użyj,
TreeSet
która daje elementy w posortowanej kolejności. LUB użyjCollection.sort()
do sortowania zewnętrznego zComparator()
.źródło
źródło
z Java 8 Comparator, jeśli chcemy posortować listę, to Oto 10 najbardziej zaludnionych miast na świecie i chcemy posortować je według nazwy, zgodnie z raportem Czas. Osaka, Japonia. ... Miasto Meksyk, Meksyk. ... Pekin, Chiny. ... São Paulo, Brazylia. ... Mumbai w Indiach. ... Szanghai Chiny. ... Delhi, Indie. ... Tokio, Japonia.
źródło
Sortowanie ArrayList według kryteriów zdefiniowanych przez użytkownika.
Klasa modelu
Sortowanie klasy
Klasa główna
Wynik
źródło