Czytałem o sortowaniu ArrayLists przy użyciu Komparatora, ale we wszystkich przykładach ludzie używali, compareTo
co według niektórych badań jest metodą dla Ciągów.
Chciałem posortować ArrayList niestandardowych obiektów według jednej z ich właściwości: obiektu Date ( getStartDay()
). Zwykle je porównuję, item1.getStartDate().before(item2.getStartDate())
więc zastanawiałem się, czy mógłbym napisać coś takiego:
public class CustomComparator {
public boolean compare(Object object1, Object object2) {
return object1.getStartDate().before(object2.getStartDate());
}
}
public class RandomName {
...
Collections.sort(Database.arrayList, new CustomComparator);
...
}
java
sorting
date
comparator
Samuel
źródło
źródło
Odpowiedzi:
Ponieważ
Date
implementujeComparable
, ma takącompareTo
samą metodę jakString
.Twój zwyczaj
Comparator
może wyglądać następująco:compare()
Metoda musi zwracać liczbęint
, więc nie można bezpośrednio zwracająboolean
się jak planowaliśmy tak.Twój kod sortowania będzie mniej więcej taki, jak napisałeś:
Nieco krótszym sposobem napisania tego wszystkiego, jeśli nie trzeba ponownie używać komparatora, jest napisanie go jako wbudowanej anonimowej klasy:
Od java-8
Możesz teraz napisać ostatni przykład w krótszej formie, używając wyrażenia lambda dla
Comparator
:I
List
masort(Comparator)
metodę, dzięki czemu możesz jeszcze bardziej ją skrócić:Jest to tak powszechny idiom, że istnieje wbudowana metoda generowania
Comparator
klasy dlaComparable
klucza z kluczem:Wszystkie są równoważnymi formami.
źródło
int
i że lepiej do tego użyćDate#compareTo()
. Dlaczego nie jest to wyżej oceniane, druga odpowiedź jest poza mną. Ten link może być także przydatny: Samouczek dotyczący zamawiania obiektów w Sun.com .List.sort()
.Klasy, które mają naturalny porządek sortowania (na przykład numer klasy) powinny implementować interfejs Porównywalny, podczas gdy klasy, które nie mają naturalnego porządku sortowania (na przykład Krzesło klasy), powinny być wyposażone w Komparator (lub anonimowy Komparator klasa).
Dwa przykłady:
Stosowanie:
źródło
public
przedclass
.Do sortowania
ArrayList
możesz użyć następującego fragmentu kodu:źródło
Tak, możesz. Istnieją dwie opcje porównywania elementów, interfejs porównywalny i komparator interfejs .
Oba te interfejsy pozwalają na różne zachowanie. Porównywalny pozwala sprawić, aby obiekt działał tak, jak właśnie opisałeś Ciągi (w rzeczywistości String implementuje Porównywalny). Drugi, Komparator, pozwala ci robić to, o co prosisz. Zrobiłbyś to w ten sposób:
To spowoduje, że metoda Collections.sort użyje twojego komparatora do mechanizmu sortowania. Jeśli obiekty w ArrayList implementują porównywalne, możesz zamiast tego zrobić coś takiego:
Kolekcje klasa zawiera szereg tych przydatnych, wspólnych narzędzi.
źródło
JAVA 8 wyrażenie lambda
LUB
źródło
Collections.sort(studList, Comparator.comparing(Student::getFirstName));
studList.sort(Comparator.comparing(Student::getFirstName));
W Javie 8 możesz użyć odwołania do metody dla swojego komparatora:
źródło
Ponieważ technologie pojawiają się codziennie, odpowiedź zmieni się z czasem. Spojrzałem na LambdaJ i wydaje się bardzo interesujący.
Możesz spróbować rozwiązać te zadania za pomocą LambdaJ . Można go znaleźć tutaj: http://code.google.com/p/lambdaj/
Oto przykład:
Sortuj iteracyjnie
Sortuj z lambda
Oczywiście, że tego rodzaju piękno wpływa na wydajność (średnio 2 razy), ale czy możesz znaleźć bardziej czytelny kod?
źródło
źródło
Najlepszym łatwym sposobem z JAVA 8 jest sortowanie alfabetu angielskiego
Implementacja klasy
Sortować
Jeśli chcesz sortować według alfabetu zawierającego znaki inne niż angielskie, możesz użyć ustawień regionalnych ... Poniżej kodu użyj sortowania znaków tureckich ...
Implementacja klasy
Sortować
źródło
Odniesienie do funkcji i metod
Collections.sort
Sposób można sortowaćList
za pomocąComparator
przekazać. KtóreComparator
mogą być realizowane przy użyciuComparator.comparing
metody, gdzie można zdać Referencyjna metoda jako niezbędneFunction
. Na szczęście rzeczywisty kod jest znacznie prostszy i krótszy niż ten opis.W przypadku Java 8:
lub
Innym sposobem jest
źródło
Odtąd
Java 8
nie musimy używaćCollections.sort()
bezpośrednio.List
interfejs ma domyślnąsort()
metodę:Zobacz http://visvv.blogspot.in/2016/01/sorting-objects-in-java-8.html .
źródło
Java 8 Lambda skraca sort.
źródło
Collections.sort(stdList, Comparator.comparing(SomeClass::getName));
Za pomocą Komparator fasoli można sortować według dowolnej właściwości w klasie niestandardowej.
źródło
Tak, jest to możliwe na przykład w tej odpowiedzi sortuję według właściwości
v
klasyIndexValue
Jeśli zauważysz tutaj, tworzę anonimową klasę wewnętrzną (która jest Javą dla zamknięć) i przekazuję ją bezpośrednio do
sort
metody klasyArrays
Twój obiekt może również zaimplementować
Comparable
(tak właśnie robi String i większość bibliotek podstawowych w Javie), ale to zdefiniowałoby „naturalną kolejność sortowania” klasy, którą on sam, i nie pozwala na podłączanie nowych.źródło
Comparator
:)Odkryłem, że większość, jeśli nie wszystkie z tych odpowiedzi, polegają na klasie bazowej (Object) w implementacji porównywalnej lub posiadaniu porównywalnego interfejsu pomocnika.
Nie z moim rozwiązaniem! Poniższy kod pozwala porównać pole obiektu, znając jego nazwę ciągu. Możesz łatwo go zmodyfikować, aby nie używał nazwy, ale musisz ją ujawnić lub zbudować jeden z obiektów, z którymi chcesz porównać.
źródło
Możesz spróbować Guava Ordering :
źródło
Możesz sortować za pomocą java 8
źródło
Te fragmenty kodu mogą być przydatne. Jeśli chcesz posortować obiekt w moim przypadku, chcę posortować według VolumeName:
To działa. Używam go w moim jsp.
źródło
Z tej biblioteki tutaj można posortować listę obiektów niestandardowych w wielu kolumnach. Biblioteka korzysta z funkcji wersji 8.0. Próbka jest tam również dostępna. Oto próbka do zrobienia
źródło
Możesz obejrzeć prezentację na Java Forum w Stuttgarcie w Niemczech w 2016 roku.
Tylko kilka slajdów używa języka niemieckiego, 99% treści to kod źródłowy Java oparty na języku angielskim; lubić
gdzie
OurCustomComparator
używa domyślnych metod (i innych interesujących pomysłów). Jak pokazano, prowadząc do bardzo zwięzłego kodu, aby wybrać metodę pobierającą metodę sortowania; i super proste łączenie (lub cofanie) kryteriów sortowania.Jeśli interesujesz się java8, znajdziesz tam wiele materiałów na początek.
źródło
Nowością od 1.8 jest metoda List.sort () zamiast metody Collection.sort (), więc można bezpośrednio wywołać mylistcontainer.sort ()
Oto fragment kodu, który demonstruje funkcję List.sort ():
Klasa Fruit to:
źródło
Twoja klasa customComparator musi implementować java.util.Comparator, aby mogła być używana. musi także pomijać porównanie () ORAZ równa się ()
Compare () musi odpowiedzieć na pytanie: Czy obiekt 1 jest mniejszy, równy lub większy niż obiekt 2?
pełne dokumenty: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html
źródło
Wolę ten proces:
Jeśli lista obiektów ma właściwość o nazwie
startDate
, wywołujesz ją w kółko. Możesz je nawet połączyćstartDate.time
.Wymaga to Twój obiekt, aby być
Comparable
co oznacza, że potrzebującompareTo
,equals
orazhashCode
wdrożenie.Tak, może być szybciej ... Ale teraz nie musisz tworzyć nowego Komparatora dla każdego rodzaju. Jeśli możesz zaoszczędzić czas deweloperów i zrezygnować z czasu wykonywania, możesz skorzystać z tego.
źródło
Za pomocą Java 8 use można zdefiniować za pomocą
Comparator
jednego wierszaComparator.comparing()
Użyj dowolnego z następujących sposobów:
Opcja 1:
Opcja 2:
źródło
Twoja klasa niestandardowa może implementować interfejs „Porównywalny”, który wymaga implementacji metody CompareTo. W metodzie CompareTo można następnie zdefiniować, co to znaczy, że obiekt jest mniejszy lub większy niż drugi obiekt. W twoim przykładzie może to wyglądać mniej więcej tak:
..........
Liczba ujemna oznacza, że ten jest mniejszy niż w stosunku do obiektu. Pewna liczba dodatnia oznacza, że ta jest większa niż w stosunku do obiektu i zero oznacza, że obiekty są równe.
Następnie możesz użyć collections.sort (myList), aby posortować listę bez konieczności podawania komparatora. Ta metoda ma również tę zaletę, że sortuje rzeczy automatycznie, jeśli używasz posortowanych struktur danych kolekcji, takich jak TreeSet lub TreeMap.
Możesz sprawdzić ten artykuł, jeśli chcesz przeczytać więcej na temat porównywalnego interfejsu (ujawnienie: jestem autorem;)) https://nullbeans.com/the-java-comparable-interface-automatic-sort-of-collections/
źródło
Możesz także użyć Springs PropertyComparator, jeśli masz tylko ścieżkę właściwości String do (zagnieżdżonej) właściwości, którą chcesz posortować:
Wadą jest to, że ten komparator po cichu ignoruje właściwości, które nie istnieją lub są niedostępne i obsługuje to jako wartość zerową dla porównania. Oznacza to, że powinieneś dokładnie przetestować taki komparator lub jakoś zweryfikować istnienie ścieżki właściwości.
źródło
za pomocą interfejsu API strumienia java-8 możesz sortować
ArrayList
według:źródło
Wypróbowałem wiele różnych rozwiązań dostępnych w Internecie, ale rozwiązanie, które działa dla mnie, jest dostępne pod poniższym linkiem.
https://www.java67.com/2017/07/how-to-sort-arraylist-of-objects-using.html
źródło