Wie sortiere ich ArrayList <Long> in absteigender Reihenfolge?

98

Wie sortiere ich eine ArrayList<Long>in Java in absteigender Reihenfolge?

Tamara
quelle

Antworten:

240

Hier ist ein Weg für Sie list:

list.sort(null);
Collections.reverse(list);

Oder Sie können Ihre eigene implementieren, Comparatorum den umgekehrten Schritt zu sortieren und zu eliminieren:

list.sort((o1, o2) -> o2.compareTo(o1));

Oder noch einfacher verwenden, Collections.reverseOrder()da Sie nur umkehren:

list.sort(Collections.reverseOrder());
WhiteFang34
quelle
6
l1 > l2 ? -1 : l1 == l2 ? 0 : 1Dieser Code ist lächerlich. Verwenden Sie o1.compareTo(o2)dann.
Ilalex
4
@ilya: oh yeah, guter Punkt, obwohl es o2.compareTo(o1)hier sein muss :)
WhiteFang34
2
list.sort (Collections.reverseOrder ());
Tunix
Daumen hoch fürlist.sort((o1, o2) -> o2.compareTo(o1))
Arenaq
27
Comparator<Long> comparator = Collections.reverseOrder();
Collections.sort(arrayList, comparator);
Umesh K.
quelle
Nur mit einem generischen Argument für diese Variablendeklaration.
Tom Hawtin - Tackline
18

Sie können den folgenden Code verwenden, der unten angegeben ist.

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

oder wenn Sie einen benutzerdefinierten Komparator verwenden möchten, können Sie diesen wie unten angegeben verwenden

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

Wobei CustomComparator eine Vergleichsklasse ist, die das in der Liste vorhandene Objekt vergleicht.

Balasubramanian Jayaraman
quelle
10

Java 8

Das in Java 8 zu tun ist so viel Spaß und einfacher

Collections.sort(variants,(a,b)->a.compareTo(b));
Collections.reverse(variants);

Lambda-Ausdrücke rocken hier !!!

Falls Sie mehr als eine Zeilenlogik zum Vergleichen von a und b benötigen , können Sie diese so schreiben

Collections.sort(variants,(a,b)->{
    int result = a.compareTo(b);
    return result;
});
Azerafati
quelle
1
Ich denke, wenn wir dies in b.compareTo (a) ändern, müssen wir die Sammlung nicht umkehren.
Zawhtut
@ Zawhtut, total wahr! gerade umgekehrt () erwähnt, damit Sie die Optionen kennen, haben Sie die Wahl
azerafati
Müssen Sie long in Long konvertieren?
BluE
3

Für Lamdas, bei denen sich Ihr langer Wert irgendwo in einem Objekt befindet, empfehle ich die Verwendung von:

.sorted((o1, o2) -> Long.compare(o1.getLong(), o2.getLong()))

oder noch besser:

.sorted(Comparator.comparingLong(MyObject::getLong))
Blau
quelle
2

Sortieren und dann umkehren.

user541686
quelle
2

Ein allgemeinerer Ansatz zur Implementierung unseres eigenen Komparators ist unten aufgeführt

Collections.sort(lst,new Comparator<Long>(){
                public int compare(Long o1, Long o2) {
                    return o2.compareTo(o1);
                }
            });
josephj1989
quelle
1

Durch Verwendung Collections.sort()mit einem Komparator, der die absteigende Reihenfolge liefert. Siehe Javadoc für Collections.sort .

Heiko Rupp
quelle
1

Der folgende Ansatz sortiert die Liste in absteigender Reihenfolge und behandelt auch die ' Null' -Werte. Nur für den Fall, dass Sie Nullwerte haben , löst Collections.sort () eine NullPointerException aus

      Collections.sort(list, new Comparator<Long>() {
          public int compare(Long o1, Long o2) {
                  return o1==null?Integer.MAX_VALUE:o2==null?Integer.MIN_VALUE:o2.compareTo(o1);

        }
    });
Jagadeesh
quelle
0

Sie können a auch ArrayListmit a TreeSetanstelle von a sortieren comparator. Hier ist ein Beispiel aus einer Frage, die ich zuvor für ein ganzzahliges Array hatte. Ich verwende "Zahlen" als Platzhalternamen für die ArrayList.


     import.java.util.*;
        class MyClass{
        public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        ArrayList<Integer> numbers = new ArrayList<Integer>(); 

        TreeSet<Integer> ts = new TreeSet<Integer>(numbers);
        numbers = new ArrayList<Integer>(ts);
        System.out.println("\nThe numbers in ascending order are:");
        for(int i=0; i<numbers.size(); i++)
        System.out.print(numbers.get(i).intValue()+" ");
        System.out.println("\nThe numbers in descending order are:");
        for(int i=numbers.size()-1; i>=0; i--)
        System.out.print(numbers.get(i).intValue()+" ");
    }
}
009
quelle
Aber TreeSetspeichert keine doppelten Werte.
0

Es gibt also etwas, das ich ansprechen möchte, das ich für wichtig halte und das Sie berücksichtigen sollten. Laufzeit und Speicher. Angenommen, Sie haben eine Liste und möchten sie sortieren. Nun, Sie können, es gibt eine integrierte Sortierung, oder Sie könnten Ihre eigene entwickeln. Dann sagst du, willst du die Liste umkehren. Das ist die Antwort, die oben aufgeführt ist.

Wenn Sie diese Liste erstellen, ist es möglicherweise sinnvoll, eine andere Datenstruktur zum Speichern zu verwenden und sie dann einfach in einem Array abzulegen.

Haufen machen genau das. Sie filtern Daten ein und sie verarbeiten alles. Dann können Sie alles aus dem Objekt entfernen und es wird sortiert.

Eine andere Möglichkeit wäre zu verstehen, wie Karten funktionieren. Oft hat eine Map oder HashMap, wie man sie nennt, ein zugrunde liegendes Konzept.

Zum Beispiel ... Sie geben eine Reihe von Schlüssel-Wert-Paaren ein, wobei der Schlüssel lang ist, und wenn Sie alle Elemente hinzufügen, können Sie Folgendes tun: .keys und es wird automatisch eine sortierte Liste an Sie zurückgegeben.

Es hängt davon ab, wie Sie die Daten verarbeiten, bevor Sie meiner Meinung nach mit dem Sortieren und den anschließenden Umkehrungen fortfahren

Fallenreaper
quelle
0

Die Vergleichsmethode des Komparators kann verwendet werden, um die Objekte zu vergleichen, und dann reversed()kann die Methode angewendet werden, um die Reihenfolge umzukehren -

list.stream().sorted(Comparator.comparing(Employee::getName).reversed()).collect(toList());
Amrendra
quelle