[FIXED] List.sort() von Java mit einem Komparator verstehen

Ausgabe

Ich habe den folgenden Code gefunden, der das personListArray nach dem PersonAlter von in absteigender Reihenfolge sortiert.

personList.sort((Person p1, Person p2) -> p2.getAge() - p1.getAge());

Allerdings habe ich Probleme zu verstehen, wie es funktioniert. Es scheint, dass die Funktion das Alter von und sort()subtrahiert , aber ich verstehe nicht, wie die Funktion das sortierte Array zurückgeben kann.p1p2

Wie wird sort()das Array durchlaufen und der Komparator für jedes Objekt in diesem Array verwendet?

Lösung

Dies ist nur eine (vielleicht) zu clevere Implementierung eines Komparators in Java.

Die ComparatorSchnittstelle sagt , dass compare(p1, p2)eine negative Zahl zurückgegeben werden sollte, wenn sie p1vor gehen sollten p2, Null, wenn sie gleich behandelt werden sollten, und eine positive Zahl, wenn p1sie nach gehen sollten p2.

Subtraktion geschieht, um das zu tun! Wenn p1.getAge()kleiner als p2.getAge()ist, dann p2.getAge() - p1.getAge()ist eine positive Zahl, also p1wird danach gehen p2– was nur eine andere Art ist, „absteigende Altersordnung“ zu sagen.

Den Code auf diese spezielle Weise zu schreiben, ist jedoch auf mehreren Ebenen keine gute Idee – vor allem, dass die Subtraktion zwar ein netter Trick ist, aber nicht für alle ints funktioniert . (Sie sind seit Ewigkeiten technisch in Ordnung, was immer nichtnegativ sein wird, aber Sie sollten das nicht wissen müssen.) Außerdem dauert es ein paar Sekunden, bis ein Leser des Codes die richtige Reihenfolge herausgefunden hat – selbst wenn er alles weiß Dies. (Für Sie war eine StackOverflow-Frage erforderlich.)

Eine bessere Version ist

import static java.util.Comparator.*;

personList.sort(comparingInt(Person::getAge).reversed());


Beantwortet von –
Louis Wasserman


Antwort geprüft von –
Mary Flores (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like