¿Cómo ordenar ArrayList <Long> en orden decreciente?

98

¿Cómo ordenar un ArrayList<Long>en Java en orden decreciente?

Tamara
fuente

Respuestas:

240

Aquí tienes una forma de list:

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

O puede implementar el suyo propio Comparatorpara ordenar y eliminar el paso inverso:

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

O incluso más simplemente úselo Collections.reverseOrder()ya que solo está invirtiendo:

list.sort(Collections.reverseOrder());
WhiteFang34
fuente
6
l1 > l2 ? -1 : l1 == l2 ? 0 : 1este código es ridículo. Utilice o1.compareTo(o2)entonces.
ilalex
4
@ilya: oh sí, buen punto, aunque tiene que estar o2.compareTo(o1)aquí :)
WhiteFang34
2
list.sort (Collections.reverseOrder ());
tunix
list.sort((o1, o2) -> o2.compareTo(o1))
Aprobado
27
Comparator<Long> comparator = Collections.reverseOrder();
Collections.sort(arrayList, comparator);
Umesh K
fuente
Solo con un argumento genérico en esa declaración de variable.
Tom Hawtin - tackline
18

Puede utilizar el siguiente código que se proporciona a continuación;

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

o si va a utilizar un comparador personalizado, puede utilizarlo como se indica a continuación

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

Donde CustomComparator es una clase de comparador que compara el objeto que está presente en la lista.

Balasubramanian Jayaraman
fuente
10

Java 8

Bueno, hacer esto en Java 8 es mucho más divertido y fácil.

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

¡¡¡Las expresiones lambda se mueven aquí !!!

en caso de que necesitaba una lógica más de una línea para comparar una y b se puede escribir como este

Collections.sort(variants,(a,b)->{
    int result = a.compareTo(b);
    return result;
});
azerafati
fuente
1
Creo que si cambiamos esto a b.compareTo (a), no necesitaremos revertir la colección.
zawhtut
@zawhtut, ¡totalmente cierto! acabo de mencionar reverse () para que conozca las opciones, la elección es suya
azerafati
¿Tiene que convertir long a long?
BluE
3

Para lamdas donde su valor largo está en algún lugar de un objeto, recomiendo usar:

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

o mejor:

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

Ordene, luego invierta.

usuario541686
fuente
2

Un enfoque más general para implementar nuestro propio comparador como se muestra a continuación

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

Utilizándolo Collections.sort()con un comparador que proporciona el orden decreciente. Consulte Javadoc para Collections.sort .

Heiko Rupp
fuente
1

El siguiente enfoque ordenará la lista en orden descendente y también manejará los valores ' nulos ', en caso de que tenga algún valor nulo, Collections.sort () arrojará 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
fuente
0

También puede ordenar un ArrayListcon a en TreeSetlugar de a comparator. Aquí hay un ejemplo de una pregunta que tenía antes para una matriz de enteros. Estoy usando "números" como nombre de marcador de posición para 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
fuente
Pero TreeSetno almacena valores duplicados.
0

Entonces, hay algo que me gustaría mencionar que creo que es importante y creo que debería considerar. tiempo de ejecución y memoria. Digamos que tiene una lista y quiere ordenarla, bueno, puede, hay una lista incorporada o podría desarrollar la suya propia. Entonces dices, quieres invertir la lista. Esa es la respuesta que se enumera arriba.

Sin embargo, si está creando esa lista, podría ser bueno usar una estructura de datos diferente para almacenarla y luego simplemente volcarla en una matriz.

Montones hacen precisamente esto. Filtra los datos y se encargará de todo, luego puede sacar todo del objeto y se ordenará.

Otra opción sería comprender cómo funcionan los mapas. Muchas veces, un Mapa o HashMap, como se llaman las cosas, tiene un concepto subyacente detrás.

Por ejemplo ... ingresa un grupo de pares clave-valor donde la clave es la larga, y cuando agrega todos los elementos, puede hacer: .keysy le devolverá una lista ordenada automáticamente.

Depende de cómo procese los datos antes de cómo creo que debe continuar con su clasificación y posteriores reversiones

Caído
fuente
0

El método de comparación del comparador se puede utilizar para comparar los objetos y luego reversed()se puede aplicar el método para invertir el orden:

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