Comparable ist eine Schnittstelle, die von der Klasse des Objekts selbst implementiert wird. Sie definiert eine Methode compareTo(), die die natürliche Sortierreihenfolge festlegt.
Comparator ist eine separate Schnittstelle, die die Methode compare(o1, o2) implementiert. Sie ermöglicht die Definition mehrerer Sortiermethoden, ohne den Code der Klasse selbst zu ändern.
Wann verwenden:
Beispiele:
// Comparable class Student implements Comparable<Student> { String name; int note; public int compareTo(Student other) { return this.note - other.note; } } // Comparator Comparator<Student> byName = new Comparator<Student>() { public int compare(Student s1, Student s2) { return s1.name.compareTo(s2.name); } }; List<Student> students = ...; Collections.sort(students); // Sortierung nach note Collections.sort(students, byName); // Sortierung nach name
Kann man eine Liste von Objekten, die Comparable nicht implementieren, ohne Comparator sortieren?
Antwort: Nein. Wenn die Klasse Comparable nicht implementiert und kein Comparator übergeben wird, führt der Sortierungsversuch der Sammlung zu einem ClassCastException.
Beispiel:
class Animal {} List<Animal> animals = ...; Collections.sort(animals); // ClassCastException, wenn kein Comparable vorhanden ist
Geschichte
Im Inventarisierungsprojekt wurde vergessen, Comparable für die Klasse Item zu implementieren. Es gab einen Sortierungsversuch über Collections.sort(items). Infolgedessen stürzte die Anwendung regelmäßig mit ClassCastException ab, da die Methode compareTo() fehlte.
Geschichte
Im Dienst zur Berechnung von Schülerbewertungen hatte der Entwickler den Vergleich nach dem Feld note nur in der Methode compareTo() implementiert. Später wurde es notwendig, nach Namen und Geburtsdatum zu sortieren, aber der Code der Klasse wuchs mit Hilfsmethoden, anstatt verschiedene Comparator zu verwenden und komplexe Logik in compareTo() zu vermeiden.
Geschichte
Im Online-Bestellprodukt versuchten sie, Comparator mit einer Lambda-Ausdruck zur Sortierung von Bestellungen nach Datum zu verwenden, vergaßen jedoch die Möglichkeit von null-Werten für das Datum zu berücksichtigen. Das Ergebnis — unerwartete NullPointerException in der Produktion bei der Sortierung von Bestellungen ohne Lieferdatum.