Как отсортировать 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());
БелыйКлык34
источник
6
l1 > l2 ? -1 : l1 == l2 ? 0 : 1этот код нелепый. o1.compareTo(o2)Тогда используйте .
ilalex 05
4
@ilya: о да, хороший момент, хотя он должен быть o2.compareTo(o1)здесь :)
WhiteFang34
2
list.sort (Collections.reverseOrder ());
tunix
Недурно дляlist.sort((o1, o2) -> o2.compareTo(o1))
arenaq
27
Comparator<Long> comparator = Collections.reverseOrder();
Collections.sort(arrayList, comparator);
unk1102
источник
Только с аргументом generics в объявлении этой переменной.
Том Хотин - tackline
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;
});
Азерафати
источник
2
Я думаю, если мы изменим это на b.compareTo (a), нам не нужно будет отменять сборку.
zawhtut
@zawhtut, это правда! только что упомянул reverse (), чтобы вы знали варианты, выбор за вами
azerafati
1
Вам нужно конвертировать длинные в длинные?
BluE
3

Для lamdas, где ваше длинное значение находится где-то в объекте, я рекомендую использовать:

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

или даже лучше:

.sorted(Comparator.comparingLong(MyObject::getLong))
Синий
источник
2

Сортировать, потом перевернуть.

пользователь541686
источник
2

Более общий подход к реализации нашего собственного компаратора, как показано ниже

Collections.sort(lst,new Comparator<Long>(){
                public int compare(Long o1, Long o2) {
                    return o2.compareTo(o1);
                }
            });
josephj1989
источник
1

Используя Collections.sort()с компаратором, который обеспечивает порядок убывания. См. Javadoc для Collections.sort .

Хайко Рупп
источник
1

Следующий подход сортирует список в порядке убывания, а также обрабатывает « нулевые » значения, на всякий случай, если у вас есть какие-либо нулевые значения, 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помощью a 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()+" ");
    }
}
009
источник
Но TreeSetне хранит повторяющиеся значения.
0

Итак, я хотел бы поднять кое-что, что я считаю важным, и я думаю, что вам следует подумать. время выполнения и память. Допустим, у вас есть список и вы хотите его отсортировать, ну, вы можете, есть встроенная сортировка или вы можете разработать свой собственный. Затем вы говорите: хотите перевернуть список. Это ответ, который указан выше.

Однако, если вы создаете этот список, было бы хорошо использовать другую структуру данных для его хранения, а затем просто выгружать его в массив.

Кучи делают именно это. Вы фильтруете данные, и он обрабатывает все, затем вы можете извлечь все из объекта, и оно будет отсортировано.

Другой вариант - понять, как работают карты. Часто Map или HashMap, как нечто называемое, имеют в основе лежащую концепцию.

Например .... вы вводите кучу пар ключ-значение, где ключ является длинным, и когда вы добавляете все элементы, вы можете сделать: .keysи он автоматически вернет вам отсортированный список.

Это зависит от того, как вы обрабатываете данные до того, как я думаю, вам следует продолжить сортировку и последующие реверсы

Падший жнец
источник
0

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

list.stream().sorted(Comparator.comparing(Employee::getName).reversed()).collect(toList());
Амрендра
источник
0

Использование List.sort()иComparator.comparingLong()

numberList.sort(Comparator.comparingLong(x -> -x));
смертельный выстрел
источник