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.
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.
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).
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.
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ć:
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ą:
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.
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 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]
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).
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:
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ą.
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;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;}
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.
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 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());
arrOfObjectsjest {6,5,4,3,2,1}teraz. Jeśli masz tablicę czegoś innego niż ints - użyj odpowiedniego obiektu zamiast Integer.
Czasami ćwiczymy na przykładzie, tutaj jest pełny:
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]);}}
kompilowanie ...
javac sortdec.java
nazywając to ...
java sortdesc
WYNIK
IntArrayElements in reverse order:30161592StringArrayElements in reverse order:
PP
OO
FF
DD
AA
Jeśli chcesz wypróbować tablicę alfanumeryczną ...
//replace this line:String[] stringArray=newString[]{"FF","PP","AA","OO","DD"};//with this:String[] stringArray=newString[]{"10FF","20AA","50AA"};
Odpowiedzi:
Możesz użyć tego do sortowania wszelkiego rodzaju obiektów
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 komparatorCollections.reverseOrder()
, spowoduje to zgłoszenie błęduBę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.
źródło
Collections.reverseOrder(this)
na listę
dla tablicy
źródło
Możesz użyć tego:
Collections.reverseOrder()
zwracaComparator
użycie odwrotnego porządku naturalnego. Możesz uzyskać odwróconą wersję własnego komparatora za pomocąCollections.reverseOrder(myComparator)
.źródło
Collections.sort()
przyjmujeList
jako parametr wejściowy, a nie tablicę.alternatywą może być (dla liczb !!!)
Dosłownie mówione:
źródło
Integer.MIN_VALUE
(lub cokolwiek prymitywne jest używany). Byłoby lepiejsort()
, a potemreverse()
, ale będziesz musiał zrobić to cofanie się, ponieważ nie dodająArrays.reverse()
implementacje.bez wyraźnego komparatora:
z wyraźnym komparatorem:
źródło
Java 8:
Aktualizacja:
reversed()
odwraca określony komparator. Zwykle komparatory porządkują rosnąco, więc zmienia to kolejność malejącą.źródło
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ć:źródło
Arrays.sort(primitives); ArrayUtils.reverse(primitives);
Najpierw musisz posortować tablicę, używając:
Następnie musisz odwrócić kolejność od rosnącej do malejącej za pomocą:
źródło
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.
źródło
Nie jest możliwe bezpośrednie odwrócenie sortowania tablicy prymitywów (tj.
int[] arr = {1, 2, 3};
) Przy użyciuArrays.sort()
iCollections.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:
źródło
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 :
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: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ą.
źródło
lub
źródło
Wiem, że jest to dość stary wątek, ale tutaj jest zaktualizowana wersja dla Integers i Java 8:
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ć:
źródło
To działało dla mnie:
Wynik:
źródło
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.
źródło
Możesz użyć operacji strumieniowych ( Collections.stream () ) za pomocą Comparator.reverseOrder () .
Powiedzmy, że masz tę kolekcję:
Aby wydrukować elementy w ich „naturalnej” kolejności, możesz użyć metody sorted () (lub pominąć ją i uzyskać ten sam wynik):
Lub, aby wydrukować je w malejącej (odwrotnej) kolejności, możesz użyć posortowanej metody, która pobiera Komparator i odwrócić kolejność:
Zauważ, że wymaga to, aby kolekcja zaimplementowała Porównywalne (podobnie jak Liczba całkowita, Ciąg itp.).
źródło
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ć:
arrOfObjects
jest{6,5,4,3,2,1}
teraz. Jeśli masz tablicę czegoś innego niż ints - użyj odpowiedniego obiektu zamiastInteger
.źródło
W powyższych dyskusjach oto prosty przykład sortowania prymitywnych tablic w kolejności malejącej.
Wynik:
źródło
Prosta metoda sortowania malejącej tablicy int:
źródło
Czasami ćwiczymy na przykładzie, tutaj jest pełny:
sortdesc.java
kompilowanie ...
nazywając to ...
WYNIK
Jeśli chcesz wypróbować tablicę alfanumeryczną ...
otrzymasz WYJŚCIE w następujący sposób:
źródło
źródło
Kolejny sposób z komparatorem
źródło