Jak posortować ArrayList <Long> w kolejności malejącej?


98

Jak sortować ArrayList<Long>w Javie w porządku malejącym?

Odpowiedzi:


240

Oto jeden sposób na list:

list.sort(null);
Collections.reverse(list);

Lub możesz zaimplementować własne, Comparatoraby posortować i wyeliminować odwrotny krok:

list.sort((o1, o2) -> o2.compareTo(o1));

Lub jeszcze prościej użyj, Collections.reverseOrder()ponieważ tylko cofasz:

list.sort(Collections.reverseOrder());

6
l1 > l2 ? -1 : l1 == l2 ? 0 : 1ten kod jest śmieszny. Użyj o1.compareTo(o2)wtedy.
ilalex

4
@ilya: o tak, słuszna uwaga, chociaż musi o2.compareTo(o1)tu być :)
WhiteFang34

2
list.sort (Collections.reverseOrder ());
tunix

Kciuki w górę zalist.sort((o1, o2) -> o2.compareTo(o1))
arenaq

27
Comparator<Long> comparator = Collections.reverseOrder();
Collections.sort(arrayList, comparator);

Tylko z argumentem generycznym dotyczącym tej deklaracji zmiennej.
Tom Hawtin - tackline

18

Możesz użyć następującego kodu, który jest podany poniżej;

Collections.sort(list, Collections.reverseOrder());

lub jeśli zamierzasz użyć niestandardowego komparatora, możesz użyć go, jak podano poniżej

Collections.sort(list, Collections.reverseOrder(new CustomComparator());

Gdzie CustomComparator jest klasą porównawczą, która porównuje obiekt obecny na liście.


10

Java 8

cóż, robienie tego w java 8 jest o wiele przyjemniejsze i łatwiejsze

Collections.sort(variants,(a,b)->a.compareTo(b));
Collections.reverse(variants);

Wyrażenia lambda rządzą tutaj !!!

w przypadku, gdy potrzebne logiki więcej niż jedna linia do porównywania i b można napisać to tak

Collections.sort(variants,(a,b)->{
    int result = a.compareTo(b);
    return result;
});

1
Myślę, że jeśli zmienimy to na b.compareTo (a), nie będziemy musieli odwracać kolekcji.
zawhtut

@zawhtut, całkowicie prawda! właśnie wspomniałem reverse (), żebyś wiedział, jakie są opcje, wybór należy do Ciebie
azerafati

Czy musisz konwertować długie na długie?
BluE


3

W przypadku lamd, w których twoja długa wartość znajduje się gdzieś w obiekcie, polecam użycie:

.sorted((o1, o2) -> Long.compare(o1.getLong(), o2.getLong()))

lub nawet lepiej:

.sorted(Comparator.comparingLong(MyObject::getLong))


2

Bardziej ogólne podejście do implementacji naszego własnego Komparatora, jak poniżej

Collections.sort(lst,new Comparator<Long>(){
                public int compare(Long o1, Long o2) {
                    return o2.compareTo(o1);
                }
            });


1

Poniższe podejście posortuje listę w porządku malejącym, a także obsługuje wartości ' null ', na wypadek gdybyś miał jakiekolwiek wartości null, Collection.sort () wyrzuci NullPointerException

      Collections.sort(list, new Comparator<Long>() {
          public int compare(Long o1, Long o2) {
                  return o1==null?Integer.MAX_VALUE:o2==null?Integer.MIN_VALUE:o2.compareTo(o1);

        }
    });

0

Możesz również posortować ArrayListz a TreeSetzamiast a comparator. Oto przykład z pytania, które miałem wcześniej dla tablicy liczb całkowitych. Używam „liczb” jako symbolu zastępczego dla ArrayList.


     import.java.util.*;
        class MyClass{
        public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        ArrayList<Integer> numbers = new ArrayList<Integer>(); 

        TreeSet<Integer> ts = new TreeSet<Integer>(numbers);
        numbers = new ArrayList<Integer>(ts);
        System.out.println("\nThe numbers in ascending order are:");
        for(int i=0; i<numbers.size(); i++)
        System.out.print(numbers.get(i).intValue()+" ");
        System.out.println("\nThe numbers in descending order are:");
        for(int i=numbers.size()-1; i>=0; i--)
        System.out.print(numbers.get(i).intValue()+" ");
    }
}

Ale TreeSetnie przechowuje zduplikowanych wartości.

0

Tak więc jest coś, co chciałbym poruszyć, co moim zdaniem jest ważne i myślę, że należy to rozważyć. środowisko wykonawcze i pamięć. Powiedzmy, że masz listę i chcesz ją posortować, cóż, możesz, istnieje rodzaj wbudowany lub możesz utworzyć własną. Następnie mówisz, chcesz odwrócić listę. To jest odpowiedź, która jest wymieniona powyżej.

Jeśli jednak tworzysz tę listę, może być dobrze użyć innej struktury danych do jej przechowywania, a następnie po prostu zrzucić ją do tablicy.

Sterty właśnie to robią. Filtrujesz w danych, a on zajmie się wszystkim, a następnie możesz zdjąć wszystko z obiektu i zostanie on posortowany.

Inną opcją byłoby zrozumienie, jak działają mapy. Często Mapa lub HashMap, jak coś się nazywa, ma za sobą podstawową koncepcję.

Na przykład .... wprowadzasz kilka par klucz-wartość, gdzie klucz jest długi, a kiedy dodasz wszystkie elementy, możesz zrobić: .keysi automatycznie zwróci ci posortowaną listę.

Zależy to od tego, w jaki sposób przetwarzasz dane przed, jak uważam, że powinieneś kontynuować sortowanie i późniejsze cofanie


0

Metoda porównawcza komparatora może być użyta do porównania obiektów, a następnie reversed()można zastosować metodę do odwrócenia kolejności -

list.stream().sorted(Comparator.comparing(Employee::getName).reversed()).collect(toList());
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.