Wie man das Chaos bändigt: ArrayList von Objekten nach einem beliebigen Feld in Java sortieren
\n\nStellen Sie sich vor: Sie schreiben eine Anwendung für einen Bücherkatalog. Sie haben eine Klasse Book mit den Feldern title, author, price und year. Sie legen Dutzende von Büchern in eine ArrayList. Und dann bittet der Benutzer: „Zeig mir zuerst die neuesten!“, und eine Minute später: „Nein, sortiere nach Preis!“.
Wenn Sie schon einmal vor einer solchen Aufgabe standen, wissen Sie – einfach Collections.sort(list) aufzurufen, wird nicht funktionieren. Java kann keine Gedanken lesen. Sie müssen ihm erklären: nach welchem Feld genau sortiert werden soll. Genau darum geht es – die häufigste Frage auf Stack Overflow zum Thema Sortierung benutzerdefinierter Objekte.
In diesem Artikel behandeln wir alle Möglichkeiten, eine ArrayList nach einer Eigenschaft eines Objekts zu sortieren: vom klassischen Comparable bis hin zu eleganten Lambda-Ausdrücken und der Stream API. Los geht's!
Vorbereitung: Die Klasse, die wir sortieren werden
\n\nFür die Beispiele erstellen wir eine einfache Klasse Person:
public class Person {\n private String name;\n private int age;\n private double salary;\n\n public Person(String name, int age, double salary) {\n this.name = name;\n this.age = age;\n this.salary = salary;\n }\n\n // Getter (Setter lassen wir der Kürze halber weg)\n public String getName() { return name; }\n public int getAge() { return age; }\n public double getSalary() { return salary; }\n\n @Override\n public String toString() {\n return name + " (" + age + " Jahre, $" + salary + ")";\n }\n}\n\n\nUnd befüllen wir unsere Liste:
\n\nArrayList<Person> people = new ArrayList<>();\npeople.add(new Person("Anna", 28, 55000));\npeople.add(new Person("Boris", 35, 72000));\npeople.add(new Person("Viktor", 22, 48000));\npeople.add(new Person("Galina", 30, 62000));\n\n\nJetzt ist alles bereit für die Experimente. Wie sortiert man diese Liste nach Alter? Nach Name? Nach Gehalt? Java hat mindestens drei Möglichkeiten. Beginnen wir mit der grundlegenden.
\n\nMethode 1: Comparable – Sortierlogik direkt in die Klasse einbetten
\n\nDas Interface Comparable ist die „natürliche Ordnung“ eines Objekts. Wenn Sie möchten, dass Ihre Objekte immer nach einem Feld sortiert werden (z. B. nach Alter), implementieren Sie dieses Interface.
Ändern wir unsere Klasse Person:
public class Person implements Comparable<Person> {\n // ... Felder, Konstruktor, Getter ...\n\n @Override\n public int compareTo(Person other) {\n return Integer.compare(this.age, other.age);\n }\n}\n\n\nJetzt ist die Sortierung eine einzige Zeile:
\n\nCollections.sort(people);\nSystem.out.println(people);\n// Ausgabe: [Viktor (22 Jahre, $48000), Anna (28 Jahre, $55000), Galina (30 Jahre, $62000), Boris (35 Jahre, $72000)]\n\n\nVorteile: Einfachheit, man muss nicht über externe Comparatoren nachdenken.
\nNachteile: Sie „verdrahten“ nur eine Sortiermethode in der Klasse. Wenn morgen eine Sortierung nach Name benötigt wird, müssen Sie die Klasse ändern.
Übrigens, für die umgekehrte Reihenfolge (absteigend) können Sie Collections.reverseOrder() verwenden:
Collections.sort(people, Collections.reverseOrder());\n\n\nMethode 2: Comparator – Flexibilität ohne Änderung der Klasse
\n\nWenn Sie an verschiedenen Stellen im Programm unterschiedlich sortieren müssen, kommt Comparator zur Hilfe. Dies ist eine separate Klasse oder eine anonyme Klasse, die die Vergleichslogik enthält.
Anonyme Klasse – die Methode der alten Schule
\n\nCollections.sort(people, new Comparator<Person>() {\n @Override\n public int compare(Person p1, Person p2) {\n return p1.getName().compareTo(p2.getName());\n }\n});\n\n\nEs funktioniert, sieht aber umständlich aus. In