Mam listę podwójnych w Javie i chcę sortować ArrayList w kolejności malejącej.
Input ArrayList jest jak poniżej:
List<Double> testList = new ArrayList();
testList.add(0.5);
testList.add(0.2);
testList.add(0.9);
testList.add(0.1);
testList.add(0.1);
testList.add(0.1);
testList.add(0.54);
testList.add(0.71);
testList.add(0.71);
testList.add(0.71);
testList.add(0.92);
testList.add(0.12);
testList.add(0.65);
testList.add(0.34);
testList.add(0.62);
Wyjście powinno wyglądać tak
0.92
0.9
0.71
0.71
0.71
0.65
0.62
0.54
0.5
0.34
0.2
0.12
0.1
0.1
0.1
java
sorting
arraylist
collections
Himanshu
źródło
źródło
Comparator
:)Double
s.reverse
, ale sortowanie malejące może być w rzeczywistości szybsze niż sortowanie rosnące, a następnie cofanie. Co więcej, użycie implementacji List, która obsługujeComparator
jako argument konstruktora (utrzymując ją niezmienną), zapewniłoby sortowanie listy przez cały czas.Collections.sort
używacompareTo
za kulisami.Collections.sort(list, Collections.reverseOrder());
. Oprócz bycia bardziej idiomatycznym (i być może bardziej wydajnym), użycie komparatora w odwrotnej kolejności zapewnia, że sortowanie jest stabilne (co oznacza, że kolejność elementów nie zostanie zmieniona, gdy będą one równe w zależności od komparatora, natomiast odwrócenie zmieni kolejność ).Malejąco:
źródło
CustomData
to,List<AnotherModel>
coAnotherModel
maid
i chcę posortowaćid
? I po prostu mam dostęp doCustomData
modelu w mojej klasie.Integer.compare(rhs.customInt, lhs.customInt);
Użyj metody util klasy java.util.Collections , tj
W rzeczywistości, jeśli chcesz posortować niestandardowy obiekt, którego możesz użyć
zobacz kolekcje API
źródło
Na przykład zrobi to magię w Javie 8
Ale jeśli chcesz posortować według niektórych pól sortowanego obiektu, możesz to łatwo zrobić:
lub
lub
Źródła: https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html
źródło
Używając lambdas (Java8) i sprowadzając go do najprostszej składni (JVM będzie wnioskować dużo w tym przypadku), otrzymujesz:
Bardziej pełna wersja:
Zastosowanie lambda jest możliwe, ponieważ interfejs komparatora ma tylko jedną metodę do zaimplementowania, więc maszyna wirtualna może stwierdzić, która metoda jest implementowana. Ponieważ typy parametrów można wywnioskować, nie trzeba ich podawać (tj.
(a, b)
Zamiast(Double a, Double b)
. A ponieważ ciało lambda ma tylko jedną linię, a metoda powinna zwrócić wartość,return
wnioskuje i nawiasy klamrowe nie są konieczne.źródło
W Javie 8 istnieje domyślna metoda sortowania w interfejsie listy, która pozwoli ci posortować kolekcję, jeśli podasz komparator. Możesz łatwo posortować przykład w pytaniu w następujący sposób:
Uwaga: argumenty w lambda są zamieniane po przekazaniu do Double.compare, aby upewnić się, że sortowanie jest malejące
źródło
locationDetails.sort((locationDetailAsc,locationDetailsDsc) -> Long.compare(locationDetailsDsc.getSnapshot().getQuantity(), locationDetailAsc.getSnapshot().getQuantity()));
Możesz użyć
Collections.sort(list)
do sortowania,list
jeślilist
zawieraComparable
elementy. W przeciwnym razie polecam zaimplementować ten interfejs jak tutaj:i oczywiście zapewnij własną realizację
compareTo
metody jak tutaj:Następnie możesz ponownie użyć,
Colection.sort(list)
ponieważ teraz lista zawiera obiekty typu Porównywalne i można je sortować. Zamówienie zależy odcompareTo
metody. Sprawdź to https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html, aby uzyskać bardziej szczegółowe informacje.źródło
Collections.sort
pozwala przekazać instancję,Comparator
która definiuje logikę sortowania. Zamiast więc sortować listę w naturalnej kolejności, a następnie ją odwracać, można po prostu przejśćCollections.reverseOrder()
dosort
, aby posortować listę w odwrotnej kolejności:Jak wspomniał @ Marco13, oprócz bycia bardziej idiomatycznym (i być może bardziej wydajnym), użycie komparatora odwrotnej kolejności zapewnia, że sortowanie jest stabilne (co oznacza, że kolejność elementów nie zostanie zmieniona, gdy będą one równe według komparatora, podczas gdy cofanie zmieni kolejność)
źródło
źródło
Oto krótki ściągawka, która obejmuje typowe przypadki:
źródło
jeśli używasz Java SE 8, może to być pomocne.
źródło
Collections.reverseOrder()
żadnych argumentów, co czynicompareDouble
zbędną implementację (jest to równoważne naturalnemu uporządkowaniuDouble
s). Odpowiedź powinna być następującaCollections.sort(testList, Collections.reverseOrder());
| * | Sortowanie listy:
| => Sortuj kolejność asc:
| => Sortuj porządek Dsc:
| * | Odwróć kolejność na liście:
źródło
Możesz to zrobić w następujący sposób:
Kolekcja ma domyślny komparator, który może ci w tym pomóc.
Ponadto, jeśli chcesz korzystać z nowych funkcji Java 8, możesz to zrobić w następujący sposób:
źródło
Na przykład mam klasę Osoba: Nazwa ciągu, int wiek ==> Konstruktor nowa osoba (imię, wiek)
źródło
if you want to short by name
->if you want to sort by name
W JAVA 8 jest teraz bardzo łatwo.
- Do odwrotnego użycia tego
źródło
Możesz użyć w ten sposób
źródło
Dzięki Eclipse Collections możesz stworzyć prymitywną podwójną listę, posortować ją, a następnie odwrócić, aby uporządkować w kolejności malejącej. Takie podejście pozwoliłoby uniknąć boksowania podwójnych.
Jeśli chcesz
List<Double>
, to działałyby następujące.Jeśli chcesz zachować typ as
ArrayList<Double>
, możesz zainicjować i posortować listę za pomocąArrayListIterate
klasy narzędziowej w następujący sposób:Uwaga: jestem osobą odpowiedzialną za kolekcje Eclipse .
źródło
Poniższa linia powinna zrobić gruby
źródło