Arrays.sort()нельзя использовать непосредственно для сортировки примитивных массивов в порядке убывания. Если вы попытаетесь вызвать Arrays.sort()метод, передав обратный компаратор, определенный с помощью Collections.reverseOrder(), он выдаст ошибку
не найден подходящий метод для сортировки (int [], компаратор)
Это будет хорошо работать с «массивом объектов», таким как массив Integer, но не будет работать с примитивным массивом, таким как массив int.
Единственный способ сортировки примитивного массива в порядке убывания - сначала отсортировать массив в порядке возрастания, а затем перевернуть массив на месте. Это также верно для двумерных примитивных массивов.
Преобразуйте свои примитивы в соответствующие им объекты. Integer для int, Double для double, Boolean для boolean и т. Д.
Измаил
12
если вы все еще хотите использовать свой собственный компаратор :Collections.reverseOrder(this)
Себастьян Ходжас
Collections.reverseOrder () не принимает параметров (разве я что-то упустил?), Вместо этого я использовал myComparator.reversed ().
jsaven
1
Arrays.sort () нельзя использовать напрямую для сортировки примитивных массивов в порядке убывания. Если вы попытаетесь вызвать метод Arrays.sort (), передав обратный компаратор, определенный в Collection.reverseOrder (), он выдаст ошибку - «не найден подходящий метод для сортировки (int [], компаратор <объект>)». отлично работает с массивом Integer, но не будет работать с массивом int. Единственный способ сортировки примитивного массива в порядке убывания - сначала отсортировать массив в порядке возрастания, а затем перевернуть массив на месте. Это также верно для двумерных примитивных массивов.
int [] array = {2,4,3,6,8,7}; Arrays.sort (array, Collections.reverseOrder ()); дает мне ошибку! Ошибка: «Метод sort (int []) в типе Arrays не применим для аргументов (int [], Comparator <Object>)»
Диксит Сингла
8
int не является объектом. Попробуйте использовать Integer [] вместо этого.
Орнитоптер
6
int является основным типом, а Integer - нет. Вот почему у Integer есть такие методы, как parse, toString и т. Д.
Ornithopter
91
Вы можете использовать это:
Arrays.sort(data,Collections.reverseOrder());
Collections.reverseOrder()возвращает Comparatorиспользование в обратном естественном порядке. Вы можете получить перевернутую версию вашего собственного компаратора, используя Collections.reverseOrder(myComparator).
Этот метод на самом деле креативный, если мы сортируем числа, даже если он не является общим и может вызвать проблемы с переполнением ...
hackjutsu
3
Это очень хороший ответ для примитивных типов. Ты гений.
Халил Ибрагим Оймачи
2
Кроме того, что он будет не в состоянии в течение Integer.MIN_VALUE( в зависимости от того или примитива используется). sort()Тогда было бы лучше , reverse()но вам придется делать все наоборот, так как они не добавляли Arrays.reverse()реализации.
Андреас
1
@Halil İbrahim Oymacı: синтаксис -array у меня не работает: "неверный тип операнда int [] для унарного оператора '-'"
строка
8
@line Вы должны умножить -1 на массив. Выше кода псевдокод. Вы можете умножить -1 на массив в цикле for, затем вызвать метод Array.sort (), наконец, вы снова умножите -1 на массив.
Он отлично работает с объектами, но не с примитивами. Для сортировки примитива int вы должны отсортировать в порядке ASC, а затем перевернуть ответ.
Рассел Ск.
5
Для массива, который содержит элементы примитивов, если есть в наличии org.apache.commons.lang(3)простой способ инвертировать массив (после сортировки):
Зачем сортировать его сначала в порядке возрастания, а затем использовать внешнюю библиотеку, чтобы отменить этот порядок, если это можно сделать за один шаг?
Бетлиста
И что один шаг существа?
Иосип Маслак
5
Да, но (как указано в комментариях к этим ответам), это не работает для примитивов, на которые мой ответ обращается. Конечно, мой ответ, конечно, не самый оптимальный, но я нашел, что он отвечает критериям «простоты», которые подчеркивал первоначальный автор, т.е. Arrays.sort(primitives); ArrayUtils.reverse(primitives);
Иосип Маслак
5
Сначала вам нужно отсортировать массив с помощью:
Collections.sort(Myarray);
Затем вам нужно изменить порядок с восходящего на нисходящий, используя:
Я не знаю, каков был ваш вариант использования, однако в дополнение к другим ответам здесь другой (ленивый) вариант - по-прежнему сортировать в порядке возрастания, как вы указываете, но затем выполнять итерацию в обратном порядке.
Непосредственно невозможно выполнить обратную сортировку массива примитивов (то есть int[] arr = {1, 2, 3};), используя Arrays.sort()и Collections.reverseOrder()потому, что эти методы требуют ссылочных типов ( Integer) вместо примитивных типов (int ).
Однако мы можем использовать Java 8 Stream, чтобы сначала упаковать массив для сортировки в обратном порядке:
// 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]
Другое решение заключается в том, что если вы используете Comparable интерфейс вы можете переключать выходные значения, которые вы указали в вашем CompareTo (Object bCompared).
Где величина является атрибутом с типом данных double в моей программе. Это сортировало мой определенный класс freq в обратном порядке по величине. Таким образом, чтобы исправить это, вы переключаете значения, возвращаемые <и >. Это дает вам следующее:
Чтобы использовать это сравнение, мы просто вызываем, Arrays.sort(mFreq)который даст вам отсортированный массивfreq [] mFreq .
Прелесть (на мой взгляд) этого решения в том, что его можно использовать для сортировки определенных пользователем классов, и даже больше, чем для сортировки их по определенному атрибуту. Если реализация интерфейса Comparable звучит для вас устрашающе, я бы посоветовал вам так не думать, на самом деле это не так. Эта ссылка о том, как реализовать сопоставимые, сделала для меня намного проще. Надеющиеся люди могут воспользоваться этим решением, и ваша радость будет даже сопоставима с моей.
Это работает только для массивов ссылочных типов, но не для массивов примитивных типов.
Кимбауди
0
Это сработало для меня:
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;}
просто используйте этот метод для сортировки массива типа double в порядке убывания, вы можете использовать его для сортировки массивов любых других типов (например, int, float и т. д.), просто изменив «тип возврата», «тип аргумента» и тип переменной "x" для соответствующего типа. Вы также можете изменить "> =" на "<=" в условии if, чтобы сделать заказ по возрастанию.
Или, чтобы распечатать их в порядке убывания (в обратном порядке), вы можете использовать отсортированный метод, который принимает Comparator и обратный порядок:
Здесь происходит много беспорядка - люди предлагают решения для непримитивных значений, пытаются реализовать некоторые алгоритмы сортировки с нуля, предлагают решения, включающие дополнительные библиотеки, демонстрируя некоторые хакерские и т. Д. Ответ на оригинальный вопрос 50 / 50. Для тех, кто просто хочет скопировать / вставить:
// 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}настоящее время. Если у вас есть массив чего-то отличного от int - используйте соответствующий объект вместо Integer.
Хорошо, что иногда мы практикуемся на примере, вот полный пример:
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]);}}
компилируем это ...
javac sortdec.java
называя это ...
java sortdesc
ВЫВОД
IntArrayElements in reverse order:30161592StringArrayElements in reverse order:
PP
OO
FF
DD
AA
Если вы хотите попробовать буквенно-цифровой массив ...
//replace this line:String[] stringArray=newString[]{"FF","PP","AA","OO","DD"};//with this:String[] stringArray=newString[]{"10FF","20AA","50AA"};
Ответы:
Вы можете использовать это для сортировки всех видов объектов
Arrays.sort()
нельзя использовать непосредственно для сортировки примитивных массивов в порядке убывания. Если вы попытаетесь вызватьArrays.sort()
метод, передав обратный компаратор, определенный с помощьюCollections.reverseOrder()
, он выдаст ошибкуЭто будет хорошо работать с «массивом объектов», таким как массив Integer, но не будет работать с примитивным массивом, таким как массив int.
Единственный способ сортировки примитивного массива в порядке убывания - сначала отсортировать массив в порядке возрастания, а затем перевернуть массив на месте. Это также верно для двумерных примитивных массивов.
источник
Collections.reverseOrder(this)
для списка
для массива
источник
Вы можете использовать это:
Collections.reverseOrder()
возвращаетComparator
использование в обратном естественном порядке. Вы можете получить перевернутую версию вашего собственного компаратора, используяCollections.reverseOrder(myComparator)
.источник
Collections.sort()
принимает вList
качестве входного параметра, а не массив.альтернатива может быть (для чисел !!!)
В буквальном смысле слова:
источник
Integer.MIN_VALUE
( в зависимости от того или примитива используется).sort()
Тогда было бы лучше ,reverse()
но вам придется делать все наоборот, так как они не добавлялиArrays.reverse()
реализации.без явного компаратора:
с явным компаратором:
источник
Java 8:
Обновление:
reversed()
отменяет указанный компаратор. Обычно компараторы располагаются в порядке возрастания, поэтому это меняет порядок на убывающие.источник
Для массива, который содержит элементы примитивов, если есть в наличии
org.apache.commons.lang(3)
простой способ инвертировать массив (после сортировки):источник
Arrays.sort(primitives); ArrayUtils.reverse(primitives);
Сначала вам нужно отсортировать массив с помощью:
Затем вам нужно изменить порядок с восходящего на нисходящий, используя:
источник
Я не знаю, каков был ваш вариант использования, однако в дополнение к другим ответам здесь другой (ленивый) вариант - по-прежнему сортировать в порядке возрастания, как вы указываете, но затем выполнять итерацию в обратном порядке.
источник
Непосредственно невозможно выполнить обратную сортировку массива примитивов (то есть
int[] arr = {1, 2, 3};
), используяArrays.sort()
иCollections.reverseOrder()
потому, что эти методы требуют ссылочных типов (Integer
) вместо примитивных типов (int
).Однако мы можем использовать Java 8 Stream, чтобы сначала упаковать массив для сортировки в обратном порядке:
источник
Другое решение заключается в том, что если вы используете Comparable интерфейс вы можете переключать выходные значения, которые вы указали в вашем CompareTo (Object bCompared).
Например :
Где величина является атрибутом с типом данных double в моей программе. Это сортировало мой определенный класс freq в обратном порядке по величине. Таким образом, чтобы исправить это, вы переключаете значения, возвращаемые
<
и>
. Это дает вам следующее:Чтобы использовать это сравнение, мы просто вызываем,
Arrays.sort(mFreq)
который даст вам отсортированный массивfreq [] mFreq
.Прелесть (на мой взгляд) этого решения в том, что его можно использовать для сортировки определенных пользователем классов, и даже больше, чем для сортировки их по определенному атрибуту. Если реализация интерфейса Comparable звучит для вас устрашающе, я бы посоветовал вам так не думать, на самом деле это не так. Эта ссылка о том, как реализовать сопоставимые, сделала для меня намного проще. Надеющиеся люди могут воспользоваться этим решением, и ваша радость будет даже сопоставима с моей.
источник
или
источник
Я знаю, что это довольно старая тема, но вот обновленная версия для Integers и Java 8:
Обратите внимание, что это «o1 - o2» для обычного возрастающего порядка (или Comparator.comparingInt ()).
Это также работает для любых других видов объектов. Сказать:
источник
Это сработало для меня:
Вывод:
источник
просто используйте этот метод для сортировки массива типа double в порядке убывания, вы можете использовать его для сортировки массивов любых других типов (например, int, float и т. д.), просто изменив «тип возврата», «тип аргумента» и тип переменной "x" для соответствующего типа. Вы также можете изменить "> =" на "<=" в условии if, чтобы сделать заказ по возрастанию.
источник
Вы можете использовать потоковые операции ( Collections.stream () ) с Comparator.reverseOrder () .
Например, скажем, у вас есть эта коллекция:
Чтобы напечатать элементы в их «естественном» порядке, вы можете использовать метод sorted () (или опустить его и получить тот же результат):
Или, чтобы распечатать их в порядке убывания (в обратном порядке), вы можете использовать отсортированный метод, который принимает Comparator и обратный порядок:
Обратите внимание, что для этого в коллекции должен быть реализован Comparable (как и Integer, String и т. Д.).
источник
Здесь происходит много беспорядка - люди предлагают решения для непримитивных значений, пытаются реализовать некоторые алгоритмы сортировки с нуля, предлагают решения, включающие дополнительные библиотеки, демонстрируя некоторые хакерские и т. Д. Ответ на оригинальный вопрос 50 / 50. Для тех, кто просто хочет скопировать / вставить:
arrOfObjects
является в{6,5,4,3,2,1}
настоящее время. Если у вас есть массив чего-то отличного от int - используйте соответствующий объект вместоInteger
.источник
Для обсуждения выше, вот простой пример сортировки примитивных массивов в порядке убывания.
Вывод:
источник
Простой метод сортировки массива int по убыванию:
источник
Еще один способ с Comparator
источник
Хорошо, что иногда мы практикуемся на примере, вот полный пример:
sortdesc.java
компилируем это ...
называя это ...
ВЫВОД
Если вы хотите попробовать буквенно-цифровой массив ...
Вы получите ВЫХОД, как следует:
источник
источник