¿Hay alguna manera FÁCIL de ordenar una matriz en orden descendente, como la forma en que tienen una ordenación en orden ascendente en la clase Arrays ?
¿O tengo que dejar de ser flojo y hacerlo yo mismo: [
Arrays.sort()no se puede usar directamente para ordenar matrices primitivas en orden descendente. Si intenta llamar al Arrays.sort()método pasando Comparador inverso definido por Collections.reverseOrder(), arrojará el error
no se encontró un método adecuado para ordenar (int [], comparador)
Eso funcionará bien con 'Array of Objects' como Integer array, pero no funcionará con una matriz primitiva como int array.
La única forma de ordenar una matriz primitiva en orden descendente es, primero ordenar la matriz en orden ascendente y luego invertir la matriz en su lugar. Esto también es cierto para las matrices primitivas bidimensionales.
Convierte tus primitivas en sus respectivos objetos. Entero para int, doble para doble, booleano para booleano, etc.
Ismael
12
si aún quieres usar tu comparador personalizado :Collections.reverseOrder(this)
Sebastian Hojas
Collections.reverseOrder () no toma parámetros (a menos que me falte algo?), En su lugar utilicé myComparator.reversed ().
jsaven
1
Arrays.sort () no se puede usar directamente para ordenar matrices primitivas en orden descendente. Si intenta llamar al método Arrays.sort () pasando el Comparador inverso definido por Collection.reverseOrder (), arrojará el error: "no se encontró ningún método adecuado para sort (int [], comparator <object>)" Eso funciona bien con la matriz Integer pero no funcionará con una matriz int. La única forma de ordenar una matriz primitiva en orden descendente es, primero ordenar la matriz en orden ascendente y luego invertir la matriz en su lugar. Esto también es cierto para las matrices primitivas bidimensionales.
int [] array = {2,4,3,6,8,7}; Arrays.sort (array, Collections.reverseOrder ()); me está dando un error! El error es: "El método sort (int []) en el tipo Arrays no es aplicable para los argumentos (int [], Comparator <Object>)"
Dixit Singla
8
int no es un objeto. Intente usar Integer [] en su lugar.
Ornithopter
66
int es un tipo primario mientras que Integer no lo es. Es por eso que Integer tiene métodos como parse, toString, etc.
Ornithopter
91
Puedes usar esto:
Arrays.sort(data,Collections.reverseOrder());
Collections.reverseOrder()devuelve a Comparatorusando el orden natural inverso. Puede obtener una versión invertida de su propio comparador utilizando Collections.reverseOrder(myComparator).
Este método es realmente creativo si estamos ordenando números, a pesar de que no es genérico y podría causar problemas de desbordamiento ...
hackjutsu
3
Esta es una muy buena respuesta para los tipos primitivos. Eres un genio.
Halil İbrahim Oymacı
2
Excepto que va a fallar por Integer.MIN_VALUE(o cualquier primitiva se utiliza). Sería mejor sort(), entonces reverse(), pero tendrás que hacer la inversión tú mismo, ya que no agregaron Arrays.reverse()implementaciones.
Andreas
1
@Halil İbrahim Oymacı: la sintaxis de matriz no funciona para mí: "tipo de operando incorrecto int [] para operador unario '-'"
Línea del
8
@line Debe multiplicar -1 a la matriz. El código anterior es pseudocódigo. Puede multiplicar -1 a la matriz en un bucle for y luego llamar al método Array.sort (), por último, multiplicar -1 a la matriz nuevamente.
Actualización:
reversed()invierte el comparador especificado. Por lo general, los comparadores ordenan ascendente, por lo que esto cambia el orden a descendente.
Funciona perfectamente con objetos pero no con primitivas. Para sort primitive int, debe ordenar en orden ASC y luego invertir la respuesta.
Russell Sk.
5
Para la matriz que contiene elementos de primitivas si hay org.apache.commons.lang(3)a disposición una forma fácil de invertir la matriz (después de ordenarla) es usar:
¿Por qué ordenarlo primero en orden ascendente y luego usar una biblioteca externa para revertir este orden, cuando se puede hacer en un solo paso?
Betlista
¿Y ese ser un paso?
Josip Maslac
55
Sí, pero (como se indica en los comentarios a esas respuestas) eso no funciona para las primitivas que mi respuesta aborda. Por supuesto, mi respuesta ciertamente no es la óptima, pero encontré que cumple con los criterios de ser "fácil" que el autor original enfatizó, es decir. Arrays.sort(primitives); ArrayUtils.reverse(primitives);
Josip Maslac
5
Primero necesitas ordenar tu matriz usando:
Collections.sort(Myarray);
Luego debe invertir el orden de ascendente a descendente usando:
No sé cuál fue su caso de uso, sin embargo, además de otras respuestas aquí, otra opción (perezosa) es ordenar en orden ascendente como lo indica, pero luego iterar en orden inverso .
No es directamente posible ordenar en reversa una matriz de primitivas (es decir, int[] arr = {1, 2, 3};) usando Arrays.sort()y Collections.reverseOrder()porque esos métodos requieren tipos de referencia ( Integer) en lugar de tipos primitivos ( int).
Sin embargo, podemos usar Java 8 Stream para encuadrar primero la matriz para ordenar en orden inverso:
// an array of intsint[] arr ={1,2,3,4,5,6};// an array of reverse sorted intsint[] arrDesc =Arrays.stream(arr).boxed().sorted(Collections.reverseOrder()).mapToInt(Integer::intValue).toArray();System.out.println(Arrays.toString(arrDesc));// outputs [6, 5, 4, 3, 2, 1]
Otra solución es que si está utilizando la interfaz Comparable , puede cambiar los valores de salida que había especificado en su compareTo (Object bCompared).
Donde magnitud es un atributo con tipo de datos doble en mi programa. Esto estaba ordenando mi frecuencia de clase definida en orden inverso por su magnitud. Entonces, para corregir eso, cambia los valores devueltos por <y >. Esto te da lo siguiente:
Para hacer uso de este compareTo, simplemente llamamos al 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 usar para ordenar 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 le parece desalentadora, le animo a que no piense de esa manera, en realidad no lo es. Este enlace sobre cómo implementar comparables me facilitó mucho las cosas. Las personas que esperan pueden hacer uso de esta solución, y que su alegría será incluso comparable a la mía.
Esto solo funciona para matrices de tipos de referencia, no para matrices de tipos primitivos.
kimbaudi
0
Esto funcionó para mí:
package doublearraysort;import java.util.Arrays;import java.util.Collections;publicclassGpa{publicstaticvoid main(String[] args){// initializing unsorted double arrayDouble[] dArr =newDouble[]{newDouble(3.2),newDouble(1.2),newDouble(4.7),newDouble(3.3),newDouble(4.6),};// print all the elements available in listfor(double number : dArr){System.out.println("GPA = "+ number);}// sorting the arrayArrays.sort(dArr,Collections.reverseOrder());// print all the elements available in list againSystem.out.println("The sorted GPA Scores are:");for(double number : dArr){System.out.println("GPA = "+ number);}}}
publicdouble[] sortArrayAlgorithm(double[] array){//sort in descending orderfor(int i =0; i < array.length; i++){for(int j =0; j < array.length; j++){if(array[i]>= array[j]){double x = array[i];
array[i]= array[j];
array[j]= x;}}}return array;}
simplemente use este método para ordenar una matriz de tipo doble en orden descendente, puede usarla para ordenar matrices de cualquier otro tipo (como int, float, etc.) simplemente cambiando el "tipo de retorno", el "tipo de argumento" y la variable "x" tipo al tipo correspondiente. También puede cambiar "> =" a "<=" en la condición if para que el orden sea ascendente.
Aquí hay un montón de problemas: las personas sugieren soluciones para valores no primitivos, intentan implementar algunos algos de clasificación desde el suelo, dan soluciones que involucran bibliotecas adicionales, muestran algunos hacky, etc. La respuesta a la pregunta original es 50 / 50. Para aquellos que solo quieren copiar / pegar:
// our initial int[] array containing primitivesint[] arrOfPrimitives =newint[]{1,2,3,4,5,6};// we have to convert it into array of Objects, using java's boxingInteger[] arrOfObjects =newInteger[arrOfPrimitives.length];for(int i =0; i < arrOfPrimitives.length; i++)
arrOfObjects[i]=newInteger(arrOfPrimitives[i]);// now when we have an array of Objects we can use that nice built-in methodArrays.sort(arrOfObjects,Collections.reverseOrder());
arrOfObjectses {6,5,4,3,2,1}ahora Si tiene una matriz de algo distinto de ints, use el objeto correspondiente en lugar de Integer.
Es bueno que a veces practiquemos sobre un ejemplo, aquí hay uno completo:
sortdesc.java
import java.util.Arrays;import java.util.Collections;class sortdesc{publicstaticvoid main(String[] args){// int ArrayInteger[] intArray=newInteger[]{newInteger(15),newInteger(9),newInteger(16),newInteger(2),newInteger(30)};// Sorting int Array in descending orderArrays.sort(intArray,Collections.reverseOrder());// Displaying elements of int ArraySystem.out.println("Int Array Elements in reverse order:");for(int i=0;i<intArray.length;i++)System.out.println(intArray[i]);// String ArrayString[] stringArray=newString[]{"FF","PP","AA","OO","DD"};// Sorting String Array in descending orderArrays.sort(stringArray,Collections.reverseOrder());// Displaying elements of String ArraySystem.out.println("String Array Elements in reverse order:");for(int i=0;i<stringArray.length;i++)System.out.println(stringArray[i]);}}
compilando ...
javac sortdec.java
llamándolo ...
java sortdesc
SALIDA
IntArrayElements in reverse order:30161592StringArrayElements in reverse order:
PP
OO
FF
DD
AA
Si quieres probar una matriz alfanumérica ...
//replace this line:String[] stringArray=newString[]{"FF","PP","AA","OO","DD"};//with this:String[] stringArray=newString[]{"10FF","20AA","50AA"};
Respuestas:
Puedes usar esto para ordenar todo tipo de objetos
Arrays.sort()
no se puede usar directamente para ordenar matrices primitivas en orden descendente. Si intenta llamar alArrays.sort()
método pasando Comparador inverso definido porCollections.reverseOrder()
, arrojará el errorEso funcionará bien con 'Array of Objects' como Integer array, pero no funcionará con una matriz primitiva como int array.
La única forma de ordenar una matriz primitiva en orden descendente es, primero ordenar la matriz en orden ascendente y luego invertir la matriz en su lugar. Esto también es cierto para las matrices primitivas bidimensionales.
fuente
Collections.reverseOrder(this)
para una lista
para una matriz
fuente
Puedes usar esto:
Collections.reverseOrder()
devuelve aComparator
usando el orden natural inverso. Puede obtener una versión invertida de su propio comparador utilizandoCollections.reverseOrder(myComparator)
.fuente
Collections.sort()
toma unList
parámetro de entrada, no una matriz.Una alternativa podría ser (para los números !!!)
Hablado literalmente:
fuente
Integer.MIN_VALUE
(o cualquier primitiva se utiliza). Sería mejorsort()
, entoncesreverse()
, pero tendrás que hacer la inversión tú mismo, ya que no agregaronArrays.reverse()
implementaciones.sin comparador explícito:
con comparador explícito:
fuente
Java 8:
Actualización:
reversed()
invierte el comparador especificado. Por lo general, los comparadores ordenan ascendente, por lo que esto cambia el orden a descendente.fuente
Para la matriz que contiene elementos de primitivas si hay
org.apache.commons.lang(3)
a disposición una forma fácil de invertir la matriz (después de ordenarla) es usar:fuente
Arrays.sort(primitives); ArrayUtils.reverse(primitives);
Primero necesitas ordenar tu matriz usando:
Luego debe invertir el orden de ascendente a descendente usando:
fuente
No sé cuál fue su caso de uso, sin embargo, además de otras respuestas aquí, otra opción (perezosa) es ordenar en orden ascendente como lo indica, pero luego iterar en orden inverso .
fuente
No es directamente posible ordenar en reversa una matriz de primitivas (es decir,
int[] arr = {1, 2, 3};
) usandoArrays.sort()
yCollections.reverseOrder()
porque esos métodos requieren tipos de referencia (Integer
) en lugar de tipos primitivos (int
).Sin embargo, podemos usar Java 8 Stream para encuadrar primero la matriz para ordenar en orden inverso:
fuente
Otra solución es que si está utilizando la interfaz Comparable , puede cambiar los valores de salida que había especificado en su compareTo (Object bCompared).
Por ejemplo :
Donde magnitud es un atributo con tipo de datos doble en mi programa. Esto estaba ordenando mi frecuencia de clase definida en orden inverso por su magnitud. Entonces, para corregir eso, cambia los valores devueltos por
<
y>
. Esto te da lo siguiente:Para hacer uso de este compareTo, simplemente llamamos al
Arrays.sort(mFreq)
que le dará la matriz ordenadafreq [] mFreq
.La belleza (en mi opinión) de esta solución es que se puede usar para ordenar 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 le parece desalentadora, le animo a que no piense de esa manera, en realidad no lo es. Este enlace sobre cómo implementar comparables me facilitó mucho las cosas. Las personas que esperan pueden hacer uso de esta solución, y que su alegría será incluso comparable a la mía.
fuente
o
fuente
Sé que este es un hilo bastante antiguo, pero aquí hay una versión actualizada para Integers y Java 8:
Tenga en cuenta que es "o1 - o2" para el orden ascendente normal (o Comparator.comparingInt ()).
Esto también funciona para cualquier otro tipo de objetos. Decir:
fuente
Esto funcionó para mí:
Salida:
fuente
simplemente use este método para ordenar una matriz de tipo doble en orden descendente, puede usarla para ordenar matrices de cualquier otro tipo (como int, float, etc.) simplemente cambiando el "tipo de retorno", el "tipo de argumento" y la variable "x" tipo al tipo correspondiente. También puede cambiar "> =" a "<=" en la condición if para que el orden sea ascendente.
fuente
Puede usar operaciones de transmisión ( Collections.stream () ) con Comparator.reverseOrder () .
Por ejemplo, digamos que tiene esta colección:
Para imprimir los elementos en su orden "natural", puede utilizar el método sorted () (o dejarlo y obtener el mismo resultado):
O para imprimirlos en orden descendente (inverso), puede usar el método ordenado que toma un Comparador y revertir el orden:
Tenga en cuenta que esto requiere que la colección haya implementado Comparable (al igual que Integer, String, etc.).
fuente
Aquí hay un montón de problemas: las personas sugieren soluciones para valores no primitivos, intentan implementar algunos algos de clasificación desde el suelo, dan soluciones que involucran bibliotecas adicionales, muestran algunos hacky, etc. La respuesta a la pregunta original es 50 / 50. Para aquellos que solo quieren copiar / pegar:
arrOfObjects
es{6,5,4,3,2,1}
ahora Si tiene una matriz de algo distinto de ints, use el objeto correspondiente en lugar deInteger
.fuente
Para las discusiones anteriores, aquí hay un ejemplo sencillo para ordenar las matrices primitivas en orden descendente.
Salida:
fuente
Método simple para ordenar una matriz int descendente:
fuente
Otra forma con Comparator
fuente
Es bueno que a veces practiquemos sobre un ejemplo, aquí hay uno completo:
sortdesc.java
compilando ...
llamándolo ...
SALIDA
Si quieres probar una matriz alfanumérica ...
obtendrá la SALIDA de la siguiente manera:
fuente
fuente