Ausgabe
Ich habe den folgenden Code gefunden, der das personList
Array nach dem Person
Alter 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.p1
p2
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 Comparator
Schnittstelle sagt , dass compare(p1, p2)
eine negative Zahl zurückgegeben werden sollte, wenn sie p1
vor gehen sollten p2
, Null, wenn sie gleich behandelt werden sollten, und eine positive Zahl, wenn p1
sie 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 p1
wird 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)