Сортування Java-масиву за спаданням?


276

Чи є ЛЕГИЙ спосіб сортувати масив у порядку зменшення, як, наприклад, як вони мають сортування у порядку зростання у класі масивів ?

Або я повинен перестати лінуватися і робити це сам: [


Відповіді:


330

Ви можете використовувати це для сортування всіх видів об'єктів

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

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

Arrays.sort()не можна використовувати безпосередньо для сортування примітивних масивів у порядку зменшення. Якщо ви спробуєте викликати Arrays.sort()метод, передавши зворотний компаратор, визначений Collections.reverseOrder(), він видасть помилку

для сортування не знайдено відповідного методу (int [], компаратор)

Це буде добре працювати з 'масивом об'єктів', таким як масив Integer, але не працюватиме з примітивним масивом, таким як int масив.

Єдиний спосіб сортувати примітивний масив у порядку зменшення - це спочатку сортувати масив у порядку зростання, а потім повернути масив на місце. Це справедливо і для двовимірних примітивних масивів.


115
Він не може сортувати масиви примітивів
Masood_mj

14
Перетворіть ваші примітиви на відповідні об'єкти. Integer for int, Double для double, Boolean для boolean тощо
Ізмаїл

12
якщо ви все ще хочете скористатися власним компаратором :Collections.reverseOrder(this)
Себастьян Ходжас

Collections.reverseOrder () не приймає жодних параметрів (якщо я щось не пропускаю?), Замість цього я використовував myComparator.reversed ().
jsaven

1
Arrays.sort () не можна використовувати безпосередньо для сортування примітивних масивів у порядку зменшення. Якщо ви спробуєте викликати метод Arrays.sort (), передавши зворотний компаратор, визначений Collection.reverseOrder (), він видасть помилку - "для сортування не знайдено відповідного методу (int [], компаратор <object>)" Це буде добре працювати з масивом Integer, але не буде працювати з масивом int. Єдиний спосіб сортувати примітивний масив у порядку зменшення - це спочатку сортувати масив у порядку зростання, а потім повернути масив на місце. Це справедливо і для двовимірних примітивних масивів.
akuriako

96

для списку

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

для масиву

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

25
int [] масив = {2,4,3,6,8,7}; Arrays.sort (масив, Collections.reverseOrder ()); дає мені помилку! Помилка: "Метод сортування (int []) у типі масивів не застосовується для аргументів (int [], компаратор <Object>)"
Dixit Singla

8
int не є Об'єктом. Спробуйте використовувати замість Integer [].
Орнітоптер

6
int є основним типом, а Integer - ні. Ось чому Integer має такі методи, як синтаксичний розбір, toString тощо.
Орнітоптер

91

Ви можете скористатися цим:

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

Collections.reverseOrder()повертає Comparatorвикористовуючи зворотний природний порядок. Ви можете отримати перевернуту версію власного компаратора за допомогою Collections.reverseOrder(myComparator).


8
ОП хоче сортувати масив. Collections.sort()приймає Listяк вхідний параметр, а не масив.
Паскаль Thivent

61

альтернатива може бути (для номерів !!!)

  1. помножимо масив на -1
  2. сортувати
  3. помножте ще раз на -1

Буквально говорять:

array = -Arrays.sort(-array)

7
Цей метод насправді творчий, якщо ми сортуємо числа, хоча він не є загальним і може спричинити проблеми при переповненні ...
hackjutsu

3
Це дуже гарна відповідь для примітивних типів. Ви геній.
Халіл Ібрагім Оймамі

2
Крім того, що він буде НЕ в змозі в протягом Integer.MIN_VALUE( в залежності від того чи примітиву використовується). sort()Тоді було б краще reverse(), але вам доведеться зробити реверс самостійно, оскільки вони не додавали Arrays.reverse()реалізацій.
Андреас

1
@Halil İbrahim Oymacı: Синтаксис масиву не працює для мене: "поганий тип операнда int [] для оператора унарного" - ""
рядок

8
@line Ви повинні множити -1 для масиву. Вищий код - псевдо-код. Ви можете множити -1 для масиву в циклі for, а потім викликати метод Array.sort (), нарешті, ви множите -1 для масиву знову.
Халіл Ібрагім Оймамі

47

без явного компаратора:

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

з явним компаратором:

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

10

Java 8:

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

Оновлення: reversed()повертає вказаний компаратор. Зазвичай компаратори наказують у порядку зростання, тому це змінює порядок на низхідне.


1
Це ідеально працює з Об'єктами, але не з примітивами. Для сортування примітивного int слід сортувати в порядку ASC, а потім відповісти на відповідь.
Рассел Ск.

5

Для масиву, який містить елементи примітивів, якщо є org.apache.commons.lang(3)в розпорядженні простий спосіб повернути масив (після його сортування), використовувати:

ArrayUtils.reverse(array);

1
Навіщо сортувати його спочатку у порядку зростання, а потім використовувати зовнішню бібліотеку для відновлення цього порядку, коли це можна зробити за один крок?
Betlista

І це один крок?
Йосип Маслак

5
Так, але (як зазначено в коментарях до цих відповідей), це не працює для примітивів, на які я відповів. Звичайно, моя відповідь, безумовно, не є оптимальною, але я виявив, що він відповідає критеріям "легкості", який підкреслював оригінальний автор - тобто. Arrays.sort(primitives); ArrayUtils.reverse(primitives);
Йосип Маслак

5

Спочатку вам потрібно сортувати масив, використовуючи:

Collections.sort(Myarray);

Потім вам потрібно змінити порядок від зростання до зменшення за допомогою:

Collections.reverse(Myarray);

4

Я не знаю, яким був ваш варіант використання, окрім інших відповідей тут, ще одним (ледачим) варіантом є все-таки сортування у порядку зростання, як ви вказуєте, але потім повторення у зворотному порядку.


4

Неможливо прямо змінити сортування масиву примітивів (тобто int[] arr = {1, 2, 3};) за допомогою Arrays.sort()та Collections.reverseOrder()тому, що ці методи вимагають посилальних типів ( Integer) замість примітивних типів ( int).

Однак ми можемо використовувати Java 8 Stream, щоб спочатку встановити масив для сортування у зворотному порядку:

// an array of ints
int[] arr = {1, 2, 3, 4, 5, 6};

// an array of reverse sorted ints
int[] 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]

3

Ще одне рішення полягає в тому, що якщо ви використовуєте інтерфейс Порівняння, ви можете перемикати вихідні значення, які ви вказали у своєму сравнениеTo (Object bCompared).

Наприклад :

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;
}

Де величина - це атрибут з подвійним типом даних у моїй програмі. Це було сортування мого визначеного класу freq у зворотному порядку за його величиною. Отже, щоб виправити це, ви перемикаєте значення, повернені <і >. Це дає вам наступне:

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;
}

Щоб скористатися цим порівняннямTo, ми просто зателефонуємо, Arrays.sort(mFreq)який дасть вам відсортований масив freq [] mFreq.

Краса (на мою думку) цього рішення полягає в тому, що його можна використовувати для сортування визначених користувачем класів і навіть більше, ніж їх сортування за певним атрибутом. Якщо реалізація порівнянного інтерфейсу здається вам грізною, я б закликав вас не думати таким чином, це насправді не так. Цей посилання про те, як реалізувати порівнянні , значно полегшила для мене речі. Сподіваючись, люди можуть скористатися цим рішенням, і що ваша радість буде навіть порівнянна з моєю.



0

Я знаю, що це досить стара тема, але ось оновлена ​​версія для Integers та Java 8:

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

Зауважте, що це "o1 - o2" для звичайного порядку зростання (або Comparator.comparingInt ()).

Це також працює для будь-яких інших видів об’єктів. Сказати:

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

1
Це працює лише для масивів опорного типу, а не для масивів примітивних типів.
кімбауді

0

Це працювало для мене:

package doublearraysort;

import java.util.Arrays;
import java.util.Collections;

public class Gpa {


    public static void main(String[] args) {
        // initializing unsorted double array
        Double[] dArr = new Double[] {                 
            new Double(3.2),
            new Double(1.2),
            new Double(4.7),
            new Double(3.3),
            new Double(4.6),
           };
        // print all the elements available in list
        for (double number : dArr) {
            System.out.println("GPA = " + number);
        }

        // sorting the array
        Arrays.sort(dArr, Collections.reverseOrder());

        // print all the elements available in list again
        System.out.println("The sorted GPA Scores are:");
        for (double number : dArr) {
            System.out.println("GPA = " + number);
        }
    }
}

Вихід:

GPA = 3.2
GPA = 1.2
GPA = 4.7
GPA = 3.3
GPA = 4.6
The sorted GPA Scores are:
GPA = 4.7
GPA = 4.6
GPA = 3.3
GPA = 3.2
GPA = 1.2

0
public double[] sortArrayAlgorithm(double[] array) { //sort in descending order
    for (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 тощо), просто змінивши "тип повернення", "тип аргументу" та тип змінної "х" на відповідний тип. ви також можете змінити "> =" на "<=" в умові if, щоб замовлення зростало.


0

Ви можете використовувати потокові операції ( Collections.stream () ) з Comparator.reverseOrder () .

Наприклад, скажіть, що у вас є ця колекція:

List<String> items = new ArrayList<>();
items.add("item01");
items.add("item02");
items.add("item03");
items.add("item04");
items.add("item04");

Щоб надрукувати предмети в їх "природному" порядку, ви можете скористатися методом сортування () (або залишити його та отримати той самий результат):

items.stream()
     .sorted()
     .forEach(item -> System.out.println(item));

Або, щоб надрукувати їх у порядку зменшення (зворотного), ви можете скористатись методом сортування, який бере компаратор та скасовує замовлення:

items.stream()
     .sorted(Comparator.reverseOrder())
     .forEach(item -> System.out.println(item));

Зверніть увагу, для цього колекція має реалізовувати порівняно (як це роблять Integer, String тощо).


0

Тут відбувається багато безладу - люди пропонують рішення для непримітивних значень, намагаються реалізувати деякі сортування альго з землі, дають рішення за участю додаткових бібліотек, демонструючи деякі хиткі тощо. Відповідь на початкове запитання - 50 / 50. Для тих, хто просто хоче скопіювати / вставити:

// our initial int[] array containing primitives
int[] arrOfPrimitives = new int[]{1,2,3,4,5,6};

// we have to convert it into array of Objects, using java's boxing
Integer[] arrOfObjects = new Integer[arrOfPrimitives.length];
for (int i = 0; i < arrOfPrimitives.length; i++) 
    arrOfObjects[i] = new Integer(arrOfPrimitives[i]);

// now when we have an array of Objects we can use that nice built-in method
Arrays.sort(arrOfObjects, Collections.reverseOrder());

arrOfObjectsє {6,5,4,3,2,1}зараз. Якщо у вас є масив чогось іншого, ніж ints - використовуйте відповідний об'єкт замість Integer.


0

Для обговорень вище, ось простий приклад сортування примітивних масивів у порядку зменшення.

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] nums = { 5, 4, 1, 2, 9, 7, 3, 8, 6, 0 };
        Arrays.sort(nums);

        // reverse the array, just like dumping the array!
        // swap(1st, 1st-last) <= 1st: 0, 1st-last: nums.length - 1
        // swap(2nd, 2nd-last) <= 2nd: i++,  2nd-last: j--
        // swap(3rd, 3rd-last) <= 3rd: i++,  3rd-last: j--
        //
        for (int i = 0, j = nums.length - 1, tmp; i < j; i++, j--) {
            tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
        }

        // dump the array (for Java 4/5/6/7/8/9)
        for (int i = 0; i < nums.length; i++) {
            System.out.println("nums[" + i + "] = " + nums[i]);
        }
    }
}

Вихід:

nums[0] = 9
nums[1] = 8
nums[2] = 7
nums[3] = 6
nums[4] = 5
nums[5] = 4
nums[6] = 3
nums[7] = 2
nums[8] = 1
nums[9] = 0

0

Простий метод сортування масиву int за убуванням:

private static int[] descendingArray(int[] array) {
    Arrays.sort(array);
    int[] descArray = new int[array.length];
    for(int i=0; i<array.length; i++) {
        descArray[i] = array[(array.length-1)-i];
    }
    return descArray;
}

0

Іноді добре, що ми практикуємо приклад, ось повний:

sortdesc.java

import java.util.Arrays;
import java.util.Collections;
class sortdesc{
public static void main(String[] args){
       // int Array
       Integer[] intArray=new Integer[]{
                 new Integer(15),
                 new Integer(9),
                 new Integer(16),
                 new Integer(2),
                 new Integer(30)};

       // Sorting int Array in descending order
       Arrays.sort(intArray,Collections.reverseOrder());

       // Displaying elements of int Array
       System.out.println("Int Array Elements in reverse order:");
       for(int i=0;i<intArray.length;i++)
          System.out.println(intArray[i]);

       // String Array
       String[] stringArray=new String[]{"FF","PP","AA","OO","DD"};

       // Sorting String Array in descending order
       Arrays.sort(stringArray,Collections.reverseOrder());

       // Displaying elements of String Array
       System.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

ВИХІД

Int Array Elements in reverse order:
30
16
15
9
2
String Array Elements in reverse order:
PP
OO
FF
DD
AA

Якщо ви хочете спробувати буквено-цифровий масив ...

//replace this line:
String[] stringArray=new String[]{"FF","PP","AA","OO","DD"};

//with this:
String[] stringArray=new String[]{"10FF","20AA","50AA"};

ви отримаєте вихід, як слід:

50AA
20AA
10FF

джерело


-1

Ще один спосіб із компаратором

import java.util.Arrays;
import java.util.Comparator;
...

Integer[] aInt = {6,2,3,4,1,5,7,8,9,10};
Arrays.sort(aInt, Comparator.reverseOrder()  );
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.