Gibt es eine EINFACHE Möglichkeit, ein Array in absteigender Reihenfolge zu sortieren, so wie es in aufsteigender Reihenfolge sortiert ist? Arrays-Klasse ?
Oder muss ich aufhören faul zu sein und das selbst tun: [
Arrays.sort()kann nicht direkt verwendet werden, um primitive Arrays in absteigender Reihenfolge zu sortieren. Wenn Sie versuchen, die Arrays.sort()Methode durch Übergeben des von definierten umgekehrten Komparators aufzurufen Collections.reverseOrder(), wird der Fehler ausgegeben
Keine geeignete Methode zum Sortieren gefunden (int [], Komparator)
Dies funktioniert gut mit 'Array of Objects' wie dem Integer-Array, aber nicht mit einem primitiven Array wie dem int-Array.
Die einzige Möglichkeit, ein primitives Array in absteigender Reihenfolge zu sortieren, besteht darin, das Array zuerst in aufsteigender Reihenfolge zu sortieren und dann das Array an Ort und Stelle umzukehren. Dies gilt auch für zweidimensionale primitive Arrays.
Konvertieren Sie Ihre Grundelemente in ihre jeweiligen Objekte. Ganzzahl für int, Double für double, Boolean für Boolean usw.
Ishmael
12
Wenn Sie Ihren benutzerdefinierten Komparator weiterhin verwenden möchten :Collections.reverseOrder(this)
Sebastian Hojas
Collections.reverseOrder () akzeptiert keine Parameter (es sei denn, mir fehlt etwas?), Stattdessen habe ich myComparator.reversed () verwendet.
Jsaven
1
Arrays.sort () kann nicht direkt zum Sortieren primitiver Arrays in absteigender Reihenfolge verwendet werden. Wenn Sie versuchen, die Arrays.sort () -Methode aufzurufen, indem Sie den von Collection.reverseOrder () definierten umgekehrten Komparator übergeben, wird der Fehler "Keine geeignete Methode zum Sortieren gefunden (int [], Komparator <Objekt>)" ausgegeben funktioniert gut mit Integer-Array, funktioniert aber nicht mit einem int-Array. Die einzige Möglichkeit, ein primitives Array in absteigender Reihenfolge zu sortieren, besteht darin, das Array zuerst in aufsteigender Reihenfolge zu sortieren und dann das Array an Ort und Stelle umzukehren. Dies gilt auch für zweidimensionale primitive Arrays.
int [] array = {2,4,3,6,8,7}; Arrays.sort (Array, Collections.reverseOrder ()); gibt mir einen Fehler! Fehler ist: "Die Methode sort (int []) im Typ Arrays gilt nicht für die Argumente (int [], Comparator <Object>)"
Dixit Singla
8
int ist kein Objekt. Verwenden Sie stattdessen Integer [].
Ornithopter
6
int ist ein primärer Typ, Integer nicht. Deshalb hat Integer Methoden wie parse, toString usw.
Ornithopter
91
Sie können dies verwenden:
Arrays.sort(data,Collections.reverseOrder());
Collections.reverseOrder()Gibt a Comparatormit der umgekehrten natürlichen Reihenfolge zurück. Sie können eine invertierte Version Ihres eigenen Komparators mit erhalten Collections.reverseOrder(myComparator).
Diese Methode ist tatsächlich kreativ, wenn wir Zahlen sortieren, obwohl sie nicht generisch ist und Probleme für den Überlauf verursachen kann ...
Hackjutsu
3
Dies ist eine sehr gute Antwort für primitive Typen. Du bist ein Genie.
Halil İbrahim Oymacı
2
Außer , dass es dann nicht für Integer.MIN_VALUE(oder je nachdem , was primitives verwendet wird ). Wäre besser sort(), dann reverse(), aber Sie werden selbst zu tun haben , die Umkehr, da sie nicht hinzugefügt haben Arrays.reverse()Implementierungen.
Andreas
1
@Halil İbrahim Oymacı: -array-Syntax funktioniert bei mir nicht: "Bad Operand Type Int [] für unären Operator '-'"
Zeile
8
@line Sie müssen mehrere -1 zum Array. Der obige Code ist Pseudocode. Sie können in einer for-Schleife mehrere -1 für ein Array erstellen und dann die Methode Array.sort () aufrufen. Zuletzt können Sie -1 für ein Array erneut multiplizieren.
Update:
reversed()Kehrt den angegebenen Komparator um. Normalerweise sortieren die Komparatoren in aufsteigender Reihenfolge, sodass die Reihenfolge in absteigender Reihenfolge geändert wird.
Es funktioniert perfekt mit Objekten, aber nicht mit Grundelementen. Für sort primitive int sollten Sie in ASC-Reihenfolge sortieren und dann die Antwort umkehren.
Russell Sk.
5
Für ein Array, das Elemente von Grundelementen enthält, wenn eine org.apache.commons.lang(3)einfache Möglichkeit zum Umkehren des Arrays (nach dem Sortieren) zur Verfügung steht, verwenden Sie:
Warum sollte man es zuerst in aufsteigender Reihenfolge sortieren und dann die externe Bibliothek verwenden, um diese Reihenfolge zurückzusetzen, wenn dies in einem Schritt möglich ist?
Betlista
Und dieser eine Schritt ist?
Josip Maslac
5
Ja, aber (wie in den Kommentaren zu diesen Antworten angegeben) funktioniert dies nicht für Grundelemente, die meine Antwortadresse enthält. Natürlich ist meine Antwort sicherlich nicht die optimale, aber ich fand, dass sie die Kriterien des "einfachen" Erfüllens erfüllt, die der ursprüngliche Autor betont hat - dh. Arrays.sort(primitives); ArrayUtils.reverse(primitives);
Josip Maslac
5
Zuerst müssen Sie Ihr Array sortieren mit:
Collections.sort(Myarray);
Dann müssen Sie die Reihenfolge von aufsteigend nach absteigend umkehren, indem Sie:
Ich weiß nicht, was Ihr Anwendungsfall war, aber zusätzlich zu anderen Antworten hier besteht eine andere (faule) Option darin, weiterhin in aufsteigender Reihenfolge zu sortieren, wie Sie angeben, und dann stattdessen in umgekehrter Reihenfolge zu iterieren .
Es ist nicht direkt möglich, ein Array von Grundelementen (dh int[] arr = {1, 2, 3};) mit Arrays.sort()und umzukehren, Collections.reverseOrder()da für diese Methoden Referenztypen ( Integer) anstelle von Grundelementtypen ( ) erforderlich sindint ) .
Wir können jedoch Java 8 Stream verwenden, um das Array zuerst in umgekehrter Reihenfolge zu sortieren:
// 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]
Eine andere Lösung ist, wenn Sie das Vergleichbare verwenden Schnittstelle können Sie die Ausgangswerte umschalten , die Sie in Ihrem compareTo angegeben hatte (Object bCompared).
Wobei Größe ein Attribut mit dem Datentyp double in meinem Programm ist. Dies wurde meine definierte Klasse Sortierung Freq in umgekehrter Reihenfolge durch die Größe. Um dies zu korrigieren, wechseln Sie die vom <und zurückgegebenen Werte >. Dies gibt Ihnen Folgendes:
Um dieses compareTo zu nutzen, rufen wir einfach auf, Arrays.sort(mFreq)wodurch Sie das sortierte Array erhaltenfreq [] mFreq .
Das Schöne (meiner Meinung nach) an dieser Lösung ist, dass damit benutzerdefinierte Klassen sortiert werden können, und noch mehr, um sie nach einem bestimmten Attribut zu sortieren. Wenn die Implementierung einer vergleichbaren Schnittstelle für Sie entmutigend klingt, würde ich Sie ermutigen, nicht so zu denken, das ist es tatsächlich nicht. Dieser Link zur Implementierung vergleichbarer Dinge hat mir die Arbeit erheblich erleichtert. Hoffende Personen können von dieser Lösung Gebrauch machen, und Ihre Freude wird sogar mit meiner vergleichbar sein .
Dies funktioniert nur für Arrays vom Referenztyp, nicht für Arrays primitiver Typen.
Kimbaudi
0
Das hat bei mir funktioniert:
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;}
Verwenden Sie einfach diese Methode, um ein Array vom Typ double in absteigender Reihenfolge zu sortieren. Sie können damit Arrays anderer Typen (wie int, float usw.) sortieren, indem Sie einfach den "Rückgabetyp", den "Argumenttyp" und ändern die Variable "x" Typ auf den entsprechenden Typ. Sie können "> =" auch in der if-Bedingung in "<=" ändern, um die Reihenfolge aufsteigend zu gestalten.
Um die Elemente in ihrer "natürlichen" Reihenfolge zu drucken, können Sie die sorted () -Methode verwenden (oder sie weglassen und das gleiche Ergebnis erzielen):
Oder um sie in absteigender (umgekehrter) Reihenfolge zu drucken, können Sie die sortierte Methode verwenden, die einen Komparator verwendet, und die Reihenfolge umkehren:
Hier ist viel los - die Leute schlagen Lösungen für nicht-primitive Werte vor, versuchen, einige Sortieralgen vom Boden aus zu implementieren, geben Lösungen mit zusätzlichen Bibliotheken, zeigen einige hackige usw. Die Antwort auf die ursprüngliche Frage lautet 50 / 50. Für diejenigen, die nur kopieren / einfügen möchten:
// 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());
arrOfObjectsist {6,5,4,3,2,1}jetzt. Wenn Sie ein Array mit etwas anderem als Ints haben, verwenden Sie stattdessen das entsprechende ObjektInteger .
Antworten:
Sie können dies verwenden, um alle Arten von Objekten zu sortieren
Arrays.sort()
kann nicht direkt verwendet werden, um primitive Arrays in absteigender Reihenfolge zu sortieren. Wenn Sie versuchen, dieArrays.sort()
Methode durch Übergeben des von definierten umgekehrten Komparators aufzurufenCollections.reverseOrder()
, wird der Fehler ausgegebenDies funktioniert gut mit 'Array of Objects' wie dem Integer-Array, aber nicht mit einem primitiven Array wie dem int-Array.
Die einzige Möglichkeit, ein primitives Array in absteigender Reihenfolge zu sortieren, besteht darin, das Array zuerst in aufsteigender Reihenfolge zu sortieren und dann das Array an Ort und Stelle umzukehren. Dies gilt auch für zweidimensionale primitive Arrays.
quelle
Collections.reverseOrder(this)
für eine Liste
für ein Array
quelle
Sie können dies verwenden:
Collections.reverseOrder()
Gibt aComparator
mit der umgekehrten natürlichen Reihenfolge zurück. Sie können eine invertierte Version Ihres eigenen Komparators mit erhaltenCollections.reverseOrder(myComparator)
.quelle
Collections.sort()
Nimmt einenList
als Eingabeparameter, kein Array.eine Alternative könnte sein (für Zahlen !!!)
Wörtlich gesprochen:
quelle
Integer.MIN_VALUE
(oder je nachdem , was primitives verwendet wird ). Wäre bessersort()
, dannreverse()
, aber Sie werden selbst zu tun haben , die Umkehr, da sie nicht hinzugefügt habenArrays.reverse()
Implementierungen.ohne expliziten Komparator:
mit explizitem Komparator:
quelle
Java 8:
Update:
reversed()
Kehrt den angegebenen Komparator um. Normalerweise sortieren die Komparatoren in aufsteigender Reihenfolge, sodass die Reihenfolge in absteigender Reihenfolge geändert wird.quelle
Für ein Array, das Elemente von Grundelementen enthält, wenn eine
org.apache.commons.lang(3)
einfache Möglichkeit zum Umkehren des Arrays (nach dem Sortieren) zur Verfügung steht, verwenden Sie:quelle
Arrays.sort(primitives); ArrayUtils.reverse(primitives);
Zuerst müssen Sie Ihr Array sortieren mit:
Dann müssen Sie die Reihenfolge von aufsteigend nach absteigend umkehren, indem Sie:
quelle
Ich weiß nicht, was Ihr Anwendungsfall war, aber zusätzlich zu anderen Antworten hier besteht eine andere (faule) Option darin, weiterhin in aufsteigender Reihenfolge zu sortieren, wie Sie angeben, und dann stattdessen in umgekehrter Reihenfolge zu iterieren .
quelle
Es ist nicht direkt möglich, ein Array von Grundelementen (dh
int[] arr = {1, 2, 3};
) mitArrays.sort()
und umzukehren,Collections.reverseOrder()
da für diese Methoden Referenztypen (Integer
) anstelle von Grundelementtypen ( ) erforderlich sindint
) .Wir können jedoch Java 8 Stream verwenden, um das Array zuerst in umgekehrter Reihenfolge zu sortieren:
quelle
Eine andere Lösung ist, wenn Sie das Vergleichbare verwenden Schnittstelle können Sie die Ausgangswerte umschalten , die Sie in Ihrem compareTo angegeben hatte (Object bCompared).
Zum Beispiel :
Wobei Größe ein Attribut mit dem Datentyp double in meinem Programm ist. Dies wurde meine definierte Klasse Sortierung Freq in umgekehrter Reihenfolge durch die Größe. Um dies zu korrigieren, wechseln Sie die vom
<
und zurückgegebenen Werte>
. Dies gibt Ihnen Folgendes:Um dieses compareTo zu nutzen, rufen wir einfach auf,
Arrays.sort(mFreq)
wodurch Sie das sortierte Array erhaltenfreq [] mFreq
.Das Schöne (meiner Meinung nach) an dieser Lösung ist, dass damit benutzerdefinierte Klassen sortiert werden können, und noch mehr, um sie nach einem bestimmten Attribut zu sortieren. Wenn die Implementierung einer vergleichbaren Schnittstelle für Sie entmutigend klingt, würde ich Sie ermutigen, nicht so zu denken, das ist es tatsächlich nicht. Dieser Link zur Implementierung vergleichbarer Dinge hat mir die Arbeit erheblich erleichtert. Hoffende Personen können von dieser Lösung Gebrauch machen, und Ihre Freude wird sogar mit meiner vergleichbar sein .
quelle
oder
quelle
Ich weiß, dass dies ein ziemlich alter Thread ist, aber hier ist eine aktualisierte Version für Integers und Java 8:
Beachten Sie, dass es "o1 - o2" für die normale aufsteigende Reihenfolge (oder Comparator.comparingInt ()) ist.
Dies funktioniert auch für alle anderen Arten von Objekten. Sagen:
quelle
Das hat bei mir funktioniert:
Ausgabe:
quelle
Verwenden Sie einfach diese Methode, um ein Array vom Typ double in absteigender Reihenfolge zu sortieren. Sie können damit Arrays anderer Typen (wie int, float usw.) sortieren, indem Sie einfach den "Rückgabetyp", den "Argumenttyp" und ändern die Variable "x" Typ auf den entsprechenden Typ. Sie können "> =" auch in der if-Bedingung in "<=" ändern, um die Reihenfolge aufsteigend zu gestalten.
quelle
Sie können Stream- Operationen ( Collections.stream () ) mit Comparator.reverseOrder () verwenden. .
Angenommen, Sie haben diese Sammlung:
Um die Elemente in ihrer "natürlichen" Reihenfolge zu drucken, können Sie die sorted () -Methode verwenden (oder sie weglassen und das gleiche Ergebnis erzielen):
Oder um sie in absteigender (umgekehrter) Reihenfolge zu drucken, können Sie die sortierte Methode verwenden, die einen Komparator verwendet, und die Reihenfolge umkehren:
Beachten Sie, dass für die Auflistung Comparable implementiert sein muss (wie Integer, String usw.).
quelle
Hier ist viel los - die Leute schlagen Lösungen für nicht-primitive Werte vor, versuchen, einige Sortieralgen vom Boden aus zu implementieren, geben Lösungen mit zusätzlichen Bibliotheken, zeigen einige hackige usw. Die Antwort auf die ursprüngliche Frage lautet 50 / 50. Für diejenigen, die nur kopieren / einfügen möchten:
arrOfObjects
ist{6,5,4,3,2,1}
jetzt. Wenn Sie ein Array mit etwas anderem als Ints haben, verwenden Sie stattdessen das entsprechende ObjektInteger
.quelle
Für die obigen Diskussionen ist hier ein einfaches Beispiel, um die primitiven Arrays in absteigender Reihenfolge zu sortieren.
Ausgabe:
quelle
Einfache Methode zum Sortieren eines absteigenden int-Arrays:
quelle
Ein anderer Weg mit Comparator
quelle