Як сортувати ArrayList <Long> у порядку зменшення?


98

Як сортувати ArrayList<Long>Java в порядку зменшення?

Відповіді:


240

Ось один із способів list:

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

Або ви можете реалізувати власну Comparatorдля сортування та усунення зворотного кроку:

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

Або ще простіше використовувати, Collections.reverseOrder()оскільки ви переводите лише назад:

list.sort(Collections.reverseOrder());

6
l1 > l2 ? -1 : l1 == l2 ? 0 : 1цей код смішний. Використовуйте o1.compareTo(o2)потім.
ilalex

4
@ilya: О так, хороший момент, хоча тут потрібно бути o2.compareTo(o1)тут :)
WhiteFang34

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

Великі пальці дляlist.sort((o1, o2) -> o2.compareTo(o1))
arenaq


18

Ви можете використовувати наступний код, який наведено нижче;

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

або якщо ви збираєтесь скористатись спеціальним компаратором, ви можете використовувати його, як зазначено нижче

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

Де CustomComparator - це порівняльний клас, який порівнює об'єкт, присутній у списку.


10

Java 8

добре робити це в java 8 - це так весело і простіше

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

Лямбда-вислови гойдаються тут !!!

у випадку, якщо для порівняння a і b вам потрібна більш ніж одна лінія логіки, ви можете записати її так

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

1
Я думаю, що якщо ми змінимо це на b.compareTo (a), нам не потрібно буде змінювати колекцію.
zawhtut

@zawhtut, абсолютно правда! щойно згаданий зворотний (), щоб ви знали варіанти, вибір за вами
azerafati

Чи доведеться довго перетворювати на Лонг?
BluE


3

Для Lamdas, де ваше довге значення знаходиться десь в об'єкті, я рекомендую використовувати:

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

а ще краще:

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


2

Більш загальний підхід до впровадження власного компаратора, як показано нижче

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


1

Наступний підхід буде сортувати список у порядку зменшення, а також обробляє значення ' null ', на всякий випадок, якщо у вас є якісь нульові значення, то Collections.sort () викине 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

Ви також можете впорядкувати ArrayListз TreeSetзамість comparator. Ось приклад із питання, яке у мене було раніше, для цілого масиву. Я використовую "числа" як назву заповнювача для 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()+" ");
    }
}

Але TreeSetне зберігає повторювані значення.

0

Отже, я хотів би підняти щось, що я вважаю важливим, і я думаю, що ви повинні розглянути. час виконання та пам'ять. Скажіть, у вас є список і ви хочете його сортувати, ну можете, є вбудований у сорт або ви можете розробити свій власний. Тоді ви кажете, хочете перевернути список. Це відповідь, перелічена вище.

Якщо ви створюєте цей список, можливо, було б корисно використовувати іншу структуру даних для його зберігання, а потім просто скинути його в масив.

Купи роблять саме це. Ви фільтруєте дані, і він буде обробляти все, тоді ви можете вискакувати все з об'єкта, і це було б відсортовано.

Іншим варіантом було б зрозуміти, як працюють карти. Багато разів карта чи HashMap, як щось називається, мають за собою концепцію.

Наприклад .... ви подаєте купу пар ключових значень, де ключ довгий, і коли ви додасте всі елементи, ви можете це зробити: .keysі він автоматично поверне вам відсортований список.

Це залежить від того, як ви обробляєте дані до того, як я думаю, ви повинні продовжувати своє сортування та подальші реверси


0

Метод порівняння порівняльника може бути використаний для порівняння об'єктів, а потім метод reversed()може бути застосований для зміни порядку -

list.stream().sorted(Comparator.comparing(Employee::getName).reversed()).collect(toList());
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.