Java Array Sortuj malejąco?


Odpowiedzi:


330

Możesz użyć tego do sortowania wszelkiego rodzaju obiektów

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

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

Arrays.sort()nie można go użyć bezpośrednio do sortowania pierwotnych tablic w kolejności malejącej. Jeśli spróbujesz wywołać Arrays.sort()metodę, przekazując zdefiniowany przez siebie odwrotny komparator Collections.reverseOrder(), spowoduje to zgłoszenie błędu

nie znaleziono odpowiedniej metody sortowania (int [], komparator)

Będzie to działać poprawnie z „Array of Objects”, takim jak tablica liczb całkowitych, ale nie będzie działać z prymitywną tablicą, taką jak tablica int.

Jedynym sposobem na posortowanie pierwotnej tablicy w porządku malejącym jest najpierw posortowanie tablicy w kolejności rosnącej, a następnie odwrócenie tablicy na miejscu. Dotyczy to również dwuwymiarowych pierwotnych tablic.


115
Nie można sortować tablic prymitywów
Masood_mj

14
Konwertuj swoje prymitywy na odpowiednie obiekty. Liczba całkowita dla int, Double dla double, Boolean dla boolean itp.
Ishmael

12
jeśli nadal chcesz używać niestandardowego komparatora :Collections.reverseOrder(this)
Sebastian Hojas

Collections.reverseOrder () nie przyjmuje parametrów (chyba że czegoś mi brakuje?), Zamiast tego użyłem myComparator.reversed ().
jsaven

1
Tablicy.sort () nie można użyć bezpośrednio do sortowania prymitywnych tablic w kolejności malejącej. Jeśli spróbujesz wywołać metodę Arrays.sort (), przekazując odwrotny komparator zdefiniowany przez Collection.reverseOrder (), zwróci błąd - „nie znaleziono odpowiedniej metody sortowania (int [], komparator <obiekt>)” działa dobrze z tablicą Integer, ale nie będzie działać z tablicą int. Jedynym sposobem na posortowanie pierwotnej tablicy w porządku malejącym jest najpierw posortowanie tablicy w kolejności rosnącej, a następnie odwrócenie tablicy na miejscu. Dotyczy to również dwuwymiarowych pierwotnych tablic.
akuriako

96

na listę

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

dla tablicy

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

25
int [] array = {2,4,3,6,8,7}; Arrays.sort (tablica, Collections.reverseOrder ()); daje mi błąd! Błąd: „Metoda sort (int []) w typie Tablice nie ma zastosowania do argumentów (int [], Komparator <Obiekt>)”
Dixit Singla

8
int nie jest obiektem. Zamiast tego spróbuj użyć liczby całkowitej [].
Ornithopter,

6
int jest typem podstawowym, podczas gdy Integer nie. Właśnie dlatego liczba całkowita ma metody takie jak parsowanie, toString itp.
Ornithopter

91

Możesz użyć tego:

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

Collections.reverseOrder()zwraca Comparatorużycie odwrotnego porządku naturalnego. Możesz uzyskać odwróconą wersję własnego komparatora za pomocą Collections.reverseOrder(myComparator).


8
OP chce posortować tablicę. Collections.sort()przyjmuje Listjako parametr wejściowy, a nie tablicę.
Pascal Thivent

61

alternatywą może być (dla liczb !!!)

  1. pomnóż tablicę przez -1
  2. sortować
  3. pomnożyć jeszcze raz przez -1

Dosłownie mówione:

array = -Arrays.sort(-array)

7
Ta metoda jest rzeczywiście kreatywna, jeśli
sortujemy

3
To bardzo dobra odpowiedź dla typów pierwotnych. Jesteś geniuszem.
Halil İbrahim Oymacı

2
Tyle tylko, że będzie to nie do Integer.MIN_VALUE(lub cokolwiek prymitywne jest używany). Byłoby lepiej sort(), a potem reverse(), ale będziesz musiał zrobić to cofanie się, ponieważ nie dodają Arrays.reverse()implementacje.
Andreas

1
@Halil İbrahim Oymacı: składnia -ray nie działa dla mnie: „zły typ operandu int [] dla operatora jednoargumentowego” - ””
wiersz

8
@line Musisz wielokrotność -1 do tablicy. Powyższy kod to pseudo kod. Możesz wykonać mnożenie -1 do tablicy w pętli for, a następnie wywołać metodę Array.sort (), wreszcie wielokrotność -1 do tablicy ponownie.
Halil İbrahim Oymacı

47

bez wyraźnego komparatora:

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

z wyraźnym komparatorem:

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

10

Java 8:

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

Aktualizacja: reversed()odwraca określony komparator. Zwykle komparatory porządkują rosnąco, więc zmienia to kolejność malejącą.


1
Działa idealnie z obiektami, ale nie z prymitywami. W przypadku pierwotnego sortowania int należy posortować w kolejności ASC, a następnie odwrócić odpowiedź.
Russell Sk.

5

W przypadku tablicy zawierającej elementy prymitywów, jeśli istnieje możliwość org.apache.commons.lang(3)łatwego odwrócenia tablicy (po jej posortowaniu), należy użyć:

ArrayUtils.reverse(array);

1
Po co sortować najpierw w porządku rosnącym, a następnie użyć biblioteki zewnętrznej, aby przywrócić tę kolejność, skoro można to zrobić w jednym kroku?
Betlista

A ten jeden krok jest?
Josip Maslac

5
Tak, ale (jak stwierdzono w komentarzach do tych odpowiedzi), które nie działają dla prymitywów, na które moja odpowiedź odpowiada. Oczywiście moja odpowiedź z pewnością nie jest optymalna, ale uznałem, że spełnia ona kryteria „łatwości”, na co podkreślił autor - tj. Arrays.sort(primitives); ArrayUtils.reverse(primitives);
Josip Maslac

5

Najpierw musisz posortować tablicę, używając:

Collections.sort(Myarray);

Następnie musisz odwrócić kolejność od rosnącej do malejącej za pomocą:

Collections.reverse(Myarray);

4

Nie wiem, jaki był twój przypadek użycia, jednak oprócz innych odpowiedzi tutaj inną (leniwą) opcją jest nadal sortowanie w porządku rosnącym, jak wskazujesz, ale następnie iteracja w odwrotnej kolejności.


4

Nie jest możliwe bezpośrednie odwrócenie sortowania tablicy prymitywów (tj. int[] arr = {1, 2, 3};) Przy użyciu Arrays.sort()i Collections.reverseOrder()ponieważ metody te wymagają typów referencyjnych ( Integer) zamiast typów prymitywnych (int ).

Możemy jednak użyć strumienia Java 8, aby najpierw spakować tablicę do sortowania w odwrotnej kolejności:

// 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

Innym rozwiązaniem jest skorzystanie z Porównywalnego interfejsu , możesz przełączać wartości wyjściowe, które określiłeś w porównawczym (Object bCompared).

Na przykład :

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

Gdzie wielkość jest atrybutem z podwójnym typem danych w moim programie. To sortowało moją zdefiniowaną częstotliwość klas w odwrotnej kolejności według wielkości. Aby to naprawić, przełączasz wartości zwracane przez <i >. To daje następujące możliwości:

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

Aby skorzystać z tego porównania, po prostu wywołujemy, Arrays.sort(mFreq)co daje posortowaną tablicęfreq [] mFreq .

Zaletą (moim zdaniem) tego rozwiązania jest to, że można go stosować do sortowania klas zdefiniowanych przez użytkownika, a nawet więcej, do sortowania ich według określonego atrybutu. Jeśli implementacja porównywalnego interfejsu wydaje ci się zniechęcająca, zachęcam do tego, abyś nie myślał w ten sposób, w rzeczywistości tak nie jest. To link, jak wdrożyć porównywalne , znacznie ułatwił mi życie. Mam nadzieję, że osoby skorzystają z tego rozwiązania i że twoja radość będzie nawet porównywalna z moją.


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

lub

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

5
Jak to się ma do pytania w Javie?
Dmitry Ginzburg

0

Wiem, że jest to dość stary wątek, ale tutaj jest zaktualizowana wersja dla Integers i Java 8:

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

Zauważ, że jest to „o1 - o2” dla normalnego porządku rosnącego (lub Comparator.comparingInt ()).

Działa to również w przypadku innych rodzajów obiektów. Mówić:

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

1
Działa to tylko w przypadku tablic typów referencyjnych, a nie tablic typów pierwotnych.
kimbaudi,

0

To działało dla mnie:

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

Wynik:

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

wystarczy użyć tej metody do sortowania tablicy typu double w porządku malejącym, można jej użyć do sortowania tablic dowolnych innych typów (takich jak int, float itp.), po prostu zmieniając „typ zwracany”, „typ argumentu” i typ zmiennej „x” do odpowiedniego typu. możesz także zmienić „> =” na „<=” w warunku if, aby kolejność rosła.


0

Możesz użyć operacji strumieniowych ( Collections.stream () ) za pomocą Comparator.reverseOrder () .

Powiedzmy, że masz tę kolekcję:

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

Aby wydrukować elementy w ich „naturalnej” kolejności, możesz użyć metody sorted () (lub pominąć ją i uzyskać ten sam wynik):

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

Lub, aby wydrukować je w malejącej (odwrotnej) kolejności, możesz użyć posortowanej metody, która pobiera Komparator i odwrócić kolejność:

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

Zauważ, że wymaga to, aby kolekcja zaimplementowała Porównywalne (podobnie jak Liczba całkowita, Ciąg itp.).


0

Tutaj dzieje się dużo bałaganu - ludzie sugerują rozwiązania dla prymitywnych wartości, próbują zaimplementować niektóre algorytmy sortujące z ziemi, dają rozwiązania obejmujące dodatkowe biblioteki, popisujące się kilkoma hackami itp. Odpowiedź na pierwotne pytanie to 50 / 50. Dla tych, którzy chcą tylko skopiować / wkleić:

// 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());

arrOfObjectsjest {6,5,4,3,2,1}teraz. Jeśli masz tablicę czegoś innego niż ints - użyj odpowiedniego obiektu zamiast Integer.


0

W powyższych dyskusjach oto prosty przykład sortowania prymitywnych tablic w kolejności malejącej.

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

Wynik:

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

Prosta metoda sortowania malejącej tablicy 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

Czasami ćwiczymy na przykładzie, tutaj jest pełny:

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

kompilowanie ...

javac sortdec.java

nazywając to ...

java sortdesc

WYNIK

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

Jeśli chcesz wypróbować tablicę alfanumeryczną ...

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

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

otrzymasz WYJŚCIE w następujący sposób:

50AA
20AA
10FF

źródło


-1

Kolejny sposób z komparatorem

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()  );
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.