2009-11-07 40 views
210

¿Hay alguna manera FÁCIL de ordenar una matriz en orden descendente, por ejemplo, cómo tienen una ordenación en orden ascendente en el Arrays class?Java Array Orden descendente?

O tengo que dejar de ser perezoso y hacer esto a mí mismo: [

Respuesta

247

Usted podría utilizar esta

sort(T[] a, Comparator<? super T> c) 

Arrays.sort(a, Collections.reverseOrder()); 
+76

No puede ordenar matrices de primitivas –

+11

Convierta sus primitivos a sus objetos respectivos. Entero para int, doble para doble, booleano para booleano, etc. – Ishmael

+10

si aún desea usar su [comparador] personalizado (http://docs.oracle.com/javase/7/docs/api/java/util/Comparator .html): 'Collections.reverseOrder (this)' –

84

Se puede utilizar esta:

Arrays.sort(data, Collections.reverseOrder()); 

Collections.reverseOrder() devuelve un Comparator usando el orden natural inverso. Puede obtener una versión invertida de su propio comparador usando Collections.reverseOrder(myComparator).

+6

El OP quiere ordenar una matriz. 'Collections.sort()' toma una 'Lista' como parámetro de entrada, no una matriz. –

+1

ops, escribí Colecciones en lugar de Arrays. Se corrigió ahora. – William

+2

+1 para explicar cómo usar su propio comparador. – dj18

74

para una lista

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

para una matriz

Arrays.sort(array, Collections.reverseOrder()); 
+12

int [] array = {2,4,3,6,8,7}; Arrays.sort (array, Collections.reverseOrder()); me está dando un error! Error: "El método sort (int []) en el tipo Arrays no es aplicable para los argumentos (int [], comparador )" –

+3

int no es un objeto. Intenta usar Integer [] en su lugar. – Ornithopter

+0

¿Por qué Integer [] funciona y no int []? – OpMt

3

Para matriz que contiene elementos de primitivas si hay org.apache.commons.lang(3) a disposición de manera fácil de revertir array (después de la clasificación IT) es utilizar :

ArrayUtils.reverse(array); 
+1

¿Por qué ordenarlo primero en orden ascendente y luego usar la biblioteca externa para revertir este orden, cuando se puede hacer en un solo paso? – Betlista

+0

¿Y ese paso único? –

+0

consulte las respuestas anteriores - 'Arrays.sort()' con el comparador 'reverseOrder' ... – Betlista

2

No sé cuál era su caso de uso, sin embargo, además de o Aquí hay otra opción (lazy) para ordenar en orden ascendente como lo indica pero luego iterar en el orden inverso en su lugar.

31

Una alternativa podría ser (para números !!!)

  1. multiplicar la matriz por -1
  2. tipo
  3. multiplican una vez más con -1

Literalmente hablados:

array = -Arrays.sort(-array) 
+16

' {__________ lol ________} ' –

+7

Este método es realmente creativo si estamos ordenando números, aunque no es genérico y podría causar problemas de desbordamiento ... – hackjutsu

+2

Esta es una muy buena respuesta para tipos primitivos . Eres un genio. –

42

sin contenido explícito R:

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

con el comparador explícita:

Collections.sort(list, Collections.reverseOrder(new Comparator())); 
4

Java 8:

Arrays.sort(list, comparator.reversed()); 

Actualización: reversed() invierte el comparador especificado. Por lo general, los comparadores ordenan de forma ascendente, por lo que esto cambia el orden de descender.

2

primer lugar usted necesita para ordenar la matriz usando:

 Collections.sort(Myarray); 

Luego hay que invertir el orden de ascendente a descendente usando:

 Collections.reverse(Myarray); 
2

Otra solución es que si estás haciendo uso de la interfaz Comparable puede cambiar los valores de salida que había especificado en su compareTo (Objeto bCompared).

Por ejemplo:

public int compareTo(freq arg0) 
{ 
    int ret=0; 
    if(this.magnitude>arg0.magnitude) 
     ret= 1; 
    else if (this.magnitude==arg0.magnitude) 
     ret= 0; 
    else if (this.magnitude<arg0.magnitude) 
     ret= -1; 
    return ret; 
} 

Dónde magnitud es un atributo con el tipo de datos doble en mi programa. Esto fue ordenar mi clase definida freq en orden inverso por su magnitud. Por lo tanto, para corregir eso, cambie los valores devueltos por < y >. Esto le da la siguiente:

public int compareTo(freq arg0) 
{ 
    int ret=0; 
    if(this.magnitude>arg0.magnitude) 
     ret= -1; 
    else if (this.magnitude==arg0.magnitude) 
     ret= 0; 
    else if (this.magnitude<arg0.magnitude) 
     ret= 1; 
    return ret; 
} 

Para hacer uso de este compareTo, simplemente llamamos Arrays.sort(mFreq) que le dará la matriz ordenada freq [] mFreq.

La belleza (en mi opinión) de esta solución es que se puede utilizar para clasificar las clases definidas por el usuario, e incluso más que eso, ordenarlas por un atributo específico. Si la implementación de una interfaz Comparable te parece desalentadora, te animo a no pensar de esa manera, en realidad no es así. Este link on how to implement comparable hizo las cosas mucho más fáciles para mí. Esperando personas pueden hacer uso de esta solución, y que su alegría será comparable a la mía.

3
array.sort(function(a, b) {return b - a;}); //descending 

o

array.sort(function(a, b) {return a - b;}); //ascending 
0

sé que este es un hilo bastante viejo, pero aquí es una versión actualizada de números enteros y Java 8:

Arrays.sort(array, (o1, o2) -> o2 - o1); 

Tenga en cuenta que se trata de "o1 - o2 "para el orden ascendente normal (o Comparator.comparingInt()).

Esto también funciona para cualquier otro tipo de Objetos. Diga:

Arrays.sort(array, (o1, o2) -> o2.getValue() - o1.getValue()); 
Cuestiones relacionadas