Arrays.sort()não pode ser usado diretamente para classificar matrizes primitivas em ordem decrescente. Se você tentar chamar o Arrays.sort()método passando o comparador reverso definido por Collections.reverseOrder(), ele lançará o erro
nenhum método adequado encontrado para classificação (int [], comparador)
Isso funcionará bem com 'Matriz de objetos', como matriz inteira, mas não funcionará com uma matriz primitiva, como int array.
A única maneira de classificar uma matriz primitiva em ordem decrescente é, primeiro classifique a matriz em ordem crescente e depois inverta a matriz no lugar. Isso também é válido para matrizes primitivas bidimensionais.
Converta suas primitivas em seus respectivos objetos. Inteiro para int, Duplo para duplo, Booleano para booleano, etc.
Ishmael
12
se você ainda quiser usar seu comparador personalizado :Collections.reverseOrder(this)
Sebastian Hojas 23/10
Collections.reverseOrder () não aceita parâmetros (a menos que esteja faltando alguma coisa?); Em vez disso, usei myComparator.reversed ().
jsaven
1
Arrays.sort () não pode ser usado diretamente para classificar matrizes primitivas em ordem decrescente. Se você tentar chamar o método Arrays.sort () passando Comparator reverso definido por Collection.reverseOrder (), ele lançará o erro - "nenhum método adequado encontrado para sort (int [], comparador <object>)" funciona bem com matriz inteira, mas não funcionará com uma matriz int. A única maneira de classificar uma matriz primitiva em ordem decrescente é, primeiro classifique a matriz em ordem crescente e depois inverta a matriz no lugar. Isso também é válido para matrizes primitivas bidimensionais.
int [] array = {2,4,3,6,8,7}; Arrays.sort (array, Collections.reverseOrder ()); está me dando um erro! O erro é: "O método sort (int []) no tipo Arrays não é aplicável aos argumentos (int [], Comparador <Object>)"
Dixit Singla
8
int não é um objeto. Tente usar o número inteiro [].
Ornithopter 10/10
6
int é um tipo primário, enquanto Inteiro não. É por isso que Integer tem métodos como análise, toString etc.
Ornithopter
91
Você pode usar isto:
Arrays.sort(data,Collections.reverseOrder());
Collections.reverseOrder()retorna a Comparatorusando a ordem natural inversa. Você pode obter uma versão invertida do seu próprio comparador usando Collections.reverseOrder(myComparator).
Este método é realmente criativo, se estamos classificando números, mesmo que ele não é genérico e pode causar problemas para o estouro ...
hackjutsu
3
Esta é uma resposta muito boa para tipos primitivos. Você é um gênio.
Halil İbrahim Oymacı 27/10
2
Exceto que ele vai deixar para Integer.MIN_VALUE(ou qualquer primitiva é usado). Seria melhor sort(), então reverse(), mas você terá que fazer a inversão, já que eles não adicionaram Arrays.reverse()implementações.
Andreas
1
@Halil İbrahim Oymacı: -a sintaxe da matriz não funciona para mim: "tipo incorreto de operando int [] para operador unário '-'"
Line
8
@line Você deve usar -1 para ordenar. O código acima é pseudo-código. Você pode múltiplo -1 para matriz em um loop for e, em seguida, chame o método Array.sort (); por último, você multiplica -1 para matriz novamente.
Atualização:
reversed()inverte o comparador especificado. Geralmente, os comparadores ordenam em ordem crescente, então isso altera a ordem para decrescente.
É um trabalho perfeito com objetos, mas não com primitivos. Para classificar int primitivo, você deve classificar em ordem ASC e, em seguida, inverter a resposta.
Russell Sk.
5
Para a matriz que contém elementos de primitivas, se houver org.apache.commons.lang(3)uma maneira fácil de reverter a matriz (após a classificação), use:
Por que classificá-lo primeiro em ordem crescente e depois usar a biblioteca externa para reverter essa ordem, quando isso pode ser feito em uma etapa?
Betlista 17/04
E esse único passo?
Josip Maslac
5
Sim, mas (como indicado nos comentários a essas respostas) que não funciona para os primitivos que minha resposta aborda. É claro que minha resposta certamente não é a ideal, mas achei que ela atendia aos critérios de "fácil", enfatizados pelo autor original - ou seja. Arrays.sort(primitives); ArrayUtils.reverse(primitives);
Josip Maslac
5
Primeiro você precisa classificar sua matriz usando:
Collections.sort(Myarray);
Em seguida, você precisa reverter a ordem de ascendente para descendente usando:
Não sei qual era o seu caso de uso, no entanto, além de outras respostas aqui, outra opção (lenta) ainda é classificar em ordem crescente, conforme indicado, mas iterar na ordem inversa .
Não é diretamente possível reverter a classificação de uma matriz de primitivas (isto é, int[] arr = {1, 2, 3};) usando Arrays.sort()e Collections.reverseOrder()porque esses métodos requerem tipos de referência ( Integer) em vez de tipos primitivos ( int).
No entanto, podemos usar o Java 8 Stream para colocar primeiro a matriz em ordem inversa:
// 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]
Onde magnitude é um atributo com o tipo de dados duplo no meu programa. Isso estava classificando minha freq de classe definida em ordem inversa por sua magnitude. Portanto, para corrigir isso, você alterna os valores retornados por <e >. Isso fornece o seguinte:
Para fazer uso deste compareTo, simplesmente chamamos o Arrays.sort(mFreq)que fornecerá a matriz classificada freq [] mFreq.
A beleza (na minha opinião) dessa solução é que ela pode ser usada para classificar classes definidas pelo usuário e, mais do que isso, classificá-las por um atributo específico. Se a implementação de uma interface comparável lhe parecer assustadora, encorajo você a não pensar dessa maneira, na verdade não é. Este link sobre como implementar comparáveis tornou as coisas muito mais fáceis para mim. As pessoas que esperam podem fazer uso dessa solução e que sua alegria será comparável à minha.
Isso funciona apenas para matrizes de tipos de referência, não matrizes de tipos primitivos.
kimbaudi
0
Isso funcionou para mim:
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;}
basta usar esse método para classificar uma matriz do tipo double em ordem decrescente, você pode usá-lo para classificar matrizes de outros tipos (como int, float e etc) apenas alterando o "tipo de retorno", o "tipo de argumento" e a variável "x" tipo para o tipo correspondente. você também pode alterar "> =" para "<=" na condição if para tornar a ordem crescente.
Há muita confusão acontecendo aqui - as pessoas sugerem soluções para valores não primitivos, tentam implementar alguns algos de classificação desde o início, fornecem soluções que envolvem bibliotecas adicionais, exibem algumas hacky etc. A resposta para a pergunta original é 50 / 50 Para quem quer apenas copiar / colar:
// 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());
arrOfObjectsé {6,5,4,3,2,1}agora. Se você tiver uma matriz de algo diferente de ints - use o objeto correspondente em vez de Integer.
É bom, às vezes, praticarmos um exemplo, aqui está um 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
chamando isso ...
java sortdesc
RESULTADO
IntArrayElements in reverse order:30161592StringArrayElements in reverse order:
PP
OO
FF
DD
AA
Se você quiser experimentar uma matriz alfanumérica ...
//replace this line:String[] stringArray=newString[]{"FF","PP","AA","OO","DD"};//with this:String[] stringArray=newString[]{"10FF","20AA","50AA"};
Respostas:
Você pode usar isso para classificar todos os tipos de objetos
Arrays.sort()
não pode ser usado diretamente para classificar matrizes primitivas em ordem decrescente. Se você tentar chamar oArrays.sort()
método passando o comparador reverso definido porCollections.reverseOrder()
, ele lançará o erroIsso funcionará bem com 'Matriz de objetos', como matriz inteira, mas não funcionará com uma matriz primitiva, como int array.
A única maneira de classificar uma matriz primitiva em ordem decrescente é, primeiro classifique a matriz em ordem crescente e depois inverta a matriz no lugar. Isso também é válido para matrizes primitivas bidimensionais.
fonte
Collections.reverseOrder(this)
para uma lista
para uma matriz
fonte
Você pode usar isto:
Collections.reverseOrder()
retorna aComparator
usando a ordem natural inversa. Você pode obter uma versão invertida do seu próprio comparador usandoCollections.reverseOrder(myComparator)
.fonte
Collections.sort()
aceita umList
parâmetro como entrada, não uma matriz.uma alternativa poderia ser (para números !!!)
Literalmente falado:
fonte
Integer.MIN_VALUE
(ou qualquer primitiva é usado). Seria melhorsort()
, entãoreverse()
, mas você terá que fazer a inversão, já que eles não adicionaramArrays.reverse()
implementações.sem comparador explícito:
com comparador explícito:
fonte
Java 8:
Atualização:
reversed()
inverte o comparador especificado. Geralmente, os comparadores ordenam em ordem crescente, então isso altera a ordem para decrescente.fonte
Para a matriz que contém elementos de primitivas, se houver
org.apache.commons.lang(3)
uma maneira fácil de reverter a matriz (após a classificação), use:fonte
Arrays.sort(primitives); ArrayUtils.reverse(primitives);
Primeiro você precisa classificar sua matriz usando:
Em seguida, você precisa reverter a ordem de ascendente para descendente usando:
fonte
Não sei qual era o seu caso de uso, no entanto, além de outras respostas aqui, outra opção (lenta) ainda é classificar em ordem crescente, conforme indicado, mas iterar na ordem inversa .
fonte
Não é diretamente possível reverter a classificação de uma matriz de primitivas (isto é,
int[] arr = {1, 2, 3};
) usandoArrays.sort()
eCollections.reverseOrder()
porque esses métodos requerem tipos de referência (Integer
) em vez de tipos primitivos (int
).No entanto, podemos usar o Java 8 Stream para colocar primeiro a matriz em ordem inversa:
fonte
Outra solução é que, se você estiver usando a interface Comparable , poderá alterar os valores de saída especificados em compareTo (Object bCompared).
Por exemplo :
Onde magnitude é um atributo com o tipo de dados duplo no meu programa. Isso estava classificando minha freq de classe definida em ordem inversa por sua magnitude. Portanto, para corrigir isso, você alterna os valores retornados por
<
e>
. Isso fornece o seguinte:Para fazer uso deste compareTo, simplesmente chamamos o
Arrays.sort(mFreq)
que fornecerá a matriz classificadafreq [] mFreq
.A beleza (na minha opinião) dessa solução é que ela pode ser usada para classificar classes definidas pelo usuário e, mais do que isso, classificá-las por um atributo específico. Se a implementação de uma interface comparável lhe parecer assustadora, encorajo você a não pensar dessa maneira, na verdade não é. Este link sobre como implementar comparáveis tornou as coisas muito mais fáceis para mim. As pessoas que esperam podem fazer uso dessa solução e que sua alegria será comparável à minha.
fonte
ou
fonte
Eu sei que este é um segmento bastante antigo, mas aqui está uma versão atualizada para Inteiros e Java 8:
Observe que é "o1 - o2" para a ordem crescente normal (ou Comparator.comparingInt ()).
Isso também funciona para quaisquer outros tipos de objetos. Dizer:
fonte
Isso funcionou para mim:
Resultado:
fonte
basta usar esse método para classificar uma matriz do tipo double em ordem decrescente, você pode usá-lo para classificar matrizes de outros tipos (como int, float e etc) apenas alterando o "tipo de retorno", o "tipo de argumento" e a variável "x" tipo para o tipo correspondente. você também pode alterar "> =" para "<=" na condição if para tornar a ordem crescente.
fonte
Você pode usar operações de fluxo ( Collections.stream () ) com Comparator.reverseOrder () .
Por exemplo, digamos que você tenha esta coleção:
Para imprimir os itens na ordem "natural", você pode usar o método Sorted () (ou deixar de fora e obter o mesmo resultado):
Ou, para imprimi-los em ordem decrescente (reversa), você pode usar o método classificado que utiliza um Comparador e inverte a ordem:
Observe que isso requer que a coleção tenha implementado Comparable (como Integer, String, etc.).
fonte
Há muita confusão acontecendo aqui - as pessoas sugerem soluções para valores não primitivos, tentam implementar alguns algos de classificação desde o início, fornecem soluções que envolvem bibliotecas adicionais, exibem algumas hacky etc. A resposta para a pergunta original é 50 / 50 Para quem quer apenas copiar / colar:
arrOfObjects
é{6,5,4,3,2,1}
agora. Se você tiver uma matriz de algo diferente de ints - use o objeto correspondente em vez deInteger
.fonte
Para as discussões acima, aqui está um exemplo fácil de classificar as matrizes primitivas em ordem decrescente.
Resultado:
fonte
Método simples para classificar uma matriz int descendente:
fonte
Outra maneira com o Comparator
fonte
É bom, às vezes, praticarmos um exemplo, aqui está um completo:
sortdesc.java
compilando ...
chamando isso ...
RESULTADO
Se você quiser experimentar uma matriz alfanumérica ...
você receberá a SAÍDA da seguinte forma:
fonte
fonte