Como classificar ArrayList <Long> em ordem decrescente?

98

Como classificar um ArrayList<Long>em Java em ordem decrescente?

Tamara
fonte

Respostas:

240

Esta é uma maneira de list:

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

Ou você pode implementar o seu próprio Comparatorpara classificar e eliminar a etapa inversa:

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

Ou ainda mais simplesmente use, Collections.reverseOrder()já que você está apenas revertendo:

list.sort(Collections.reverseOrder());
WhiteFang34
fonte
6
l1 > l2 ? -1 : l1 == l2 ? 0 : 1este código é ridículo. Use o1.compareTo(o2)então.
ilalex
4
@ilya: ah sim, bom ponto, embora precise estar o2.compareTo(o1)aqui :)
WhiteFang34
2
list.sort (Collections.reverseOrder ());
tunix de
Perfeito paralist.sort((o1, o2) -> o2.compareTo(o1))
arenaq
27
Comparator<Long> comparator = Collections.reverseOrder();
Collections.sort(arrayList, comparator);
Umesh K
fonte
Apenas com um argumento genérico na declaração dessa variável.
Tom Hawtin - tackline
18

Você pode usar o código a seguir, fornecido a seguir;

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

ou se você for usar um comparador personalizado, você pode usar como é fornecido abaixo

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

Onde CustomComparator é uma classe comparadora que compara o objeto que está presente na lista.

Balasubramanian Jayaraman
fonte
10

Java 8

bem fazer isso em java 8 é muito divertido e fácil

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

Expressões lambda arrasam aqui !!!

no caso de você precisava de uma lógica mais de uma linha para comparar um e b você poderia escrevê-lo como este

Collections.sort(variants,(a,b)->{
    int result = a.compareTo(b);
    return result;
});
azerafati
fonte
1
Acho que se mudarmos para b.compareTo (a), não precisaremos reverter a coleção.
zawhtut
@zawhtut, totalmente verdade! acabei de mencionar reverse () para que você saiba as opções, a escolha é sua
azerafati
Você tem que converter long para Long?
BluE
3

Para lamdas em que o valor longo está em algum lugar de um objeto, recomendo usar:

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

ou ainda melhor:

.sorted(Comparator.comparingLong(MyObject::getLong))
Azul
fonte
2

Classifique e depois inverta.

user541686
fonte
2

Uma abordagem mais geral para implementar nosso próprio Comparador conforme abaixo

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

Usando Collections.sort()com um comparador que fornece a ordem decrescente. Consulte Javadoc para Collections.sort .

Heiko Rupp
fonte
1

A abordagem a seguir classificará a lista em ordem decrescente e também lida com os valores ' nulos ', apenas no caso de você ter algum valor nulo, Collections.sort () lançará 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);

        }
    });
Jagadeesh
fonte
0

Você também pode classificar um ArrayListcom um em TreeSetvez de um comparator. Aqui está um exemplo de uma pergunta que tive antes sobre uma matriz de inteiros. Estou usando "números" como um nome de espaço reservado para o 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
fonte
Mas TreeSetnão armazena valores duplicados.
0

Portanto, há algo que gostaria de mencionar que considero importante e que você deve considerar. tempo de execução e memória. Digamos que você tenha uma lista e queira classificá-la, bem, você pode; existe uma classificação incorporada ou você poderia desenvolver a sua própria. Então você diz, quer reverter a lista. Essa é a resposta listada acima.

No entanto, se você estiver criando essa lista, pode ser bom usar uma estrutura de dados diferente para armazená-la e depois apenas despejá-la em um array.

Montes fazem exatamente isso. Você filtra os dados e ele tratará de tudo, então você pode retirar tudo do objeto e seria classificado.

Outra opção seria entender como funcionam os mapas. Muitas vezes, um mapa ou HashMap, como as coisas são chamadas, tem um conceito subjacente por trás dele.

Por exemplo ... você alimenta um monte de pares de valores-chave onde a chave é longa, e quando você adiciona todos os elementos, você pode fazer: .keyse ele retornaria para você uma lista classificada automaticamente.

Depende de como você processa os dados antes de como eu acho que você deve continuar com sua classificação e reversões subsequentes

Fallenreaper
fonte
0

O método de comparação do comparador pode ser usado para comparar os objetos e, em seguida, o método reversed()pode ser aplicado para inverter a ordem -

list.stream().sorted(Comparator.comparing(Employee::getName).reversed()).collect(toList());
Amrendra
fonte