Comparator-Interface
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy — Lektion 45 von 87.
Während Comparable die natürliche Ordnung einer Klasse definiert, müssen Sie Objekte manchmal auf unterschiedliche Weise sortieren. Das Comparator Interface ermöglicht es Ihnen, separate Vergleichslogik zu erstellen, ohne die ursprüngliche Klasse zu ändern.
Ein Comparator ist ein externes Objekt, das zwei Objekte desselben Typs vergleicht. Dies ist nützlich, wenn Sie mehrere Sortieroptionen wünschen oder wenn Sie die Klasse selbst nicht ändern können:
import java.util.Comparator;
class NameComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p1.getName().compareTo(p2.getName());
}
}
class AgeComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p1.getAge() - p2.getAge();
}
}Sie können den Comparator dann an Sortiermethoden übergeben:
List<Person> people = new ArrayList<>();
people.add(new Person("Charlie", 30));
people.add(new Person("Alice", 25));
Collections.sort(people, new NameComparator()); // Nach Name sortiert
Collections.sort(people, new AgeComparator()); // Nach Alter sortiertFür prägnanten Code können Sie Lambda-Ausdrücke verwenden, da Comparator ein funktionales Interface ist:
Collections.sort(people, (p1, p2) -> p1.getName().compareTo(p2.getName()));Der entscheidende Unterschied: Comparable wird von der Klasse implementiert, die verglichen wird, und definiert eine natürliche Ordnung, während Comparator eine separate Klasse ist, die unbegrenzte benutzerdefinierte Sortierungen definieren kann.
Aufgabe
EinfachLassen Sie uns ein Mitarbeiter-Sortiersystem erstellen, das die Leistungsfähigkeit des Comparator-Interfaces demonstriert. Sie werden mehrere Comparatoren erstellen, um Mitarbeiter auf verschiedene Arten zu sortieren – nach Gehalt und nach Name – ohne die Klasse Employee selbst zu verändern.
Sie werden Ihren Code über vier Dateien organisieren:
Employee.java: Erstellen Sie eine Klasse, die einen Mitarbeiter mit drei privaten Feldern darstellt:name(String),department(String) undsalary(double). Fügen Sie einen Konstruktor zur Initialisierung aller Felder und Getter-Methoden für jedes Feld hinzu. Überschreiben SietoString(), um Folgendes zurückzugeben:[name] ([department]) - $[salary]SalaryComparator.java: Erstellen Sie einen Comparator, der Mitarbeiter nach Gehalt in absteigender Reihenfolge sortiert (höchstbezahlte zuerst). Implementieren Sie dasComparator<Employee>-Interface und dessencompare()-Methode. Verwenden SieDouble.compare()für den sicheren Vergleich von Gehaltswerten.NameComparator.java: Erstellen Sie einen weiteren Comparator, der Mitarbeiter alphabetisch nach Namen in aufsteigender Reihenfolge (A bis Z) sortiert. Implementieren SieComparator<Employee>und verwenden Sie diecompareTo()-Methode von String für den Vergleich.Main.java: Führen Sie alles zusammen, indem Sie eine Liste von Mitarbeitern erstellen und diese mit Ihren Comparatoren sortieren. Sie erhalten Eingaben für drei Mitarbeiter, jeweils in einer separaten Zeile im Format:name,department,salaryErstellen Sie eine
ArrayListvon Mitarbeitern und demonstrieren Sie dann beide Sortieransätze:- Sortieren Sie zuerst nach Gehalt unter Verwendung Ihres
SalaryComparatorund geben Sie jeden Mitarbeiter aus - Geben Sie eine Leerzeile aus
- Sortieren Sie dann nach Namen unter Verwendung Ihres
NameComparatorund geben Sie jeden Mitarbeiter aus
- Sortieren Sie zuerst nach Gehalt unter Verwendung Ihres
Sie erhalten drei Eingabezeilen, die jeweils Mitarbeiterdaten im Format name,department,salary enthalten.
Zum Beispiel könnte eine Eingabezeile so aussehen: Alice,Engineering,75000.0
Denken Sie daran, java.util.Comparator in Ihren Comparator-Dateien sowie java.util.ArrayList, java.util.Collections und java.util.Scanner in Ihrer Main-Datei zu importieren. Beachten Sie, wie Comparatoren es Ihnen ermöglichen, mehrere Sortierstrategien extern zu definieren – die Klasse Employee muss nichts darüber wissen, wie sie sortiert werden könnte!
Spickzettel
Das Comparator-Interface ermöglicht es Ihnen, externe Vergleichslogik zum Sortieren von Objekten zu erstellen, ohne die ursprüngliche Klasse zu ändern. Dies ist nützlich, wenn Sie mehrere Sortieroptionen benötigen.
Ein Comparator vergleicht zwei Objekte desselben Typs durch Implementierung der compare()-Methode:
import java.util.Comparator;
class NameComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p1.getName().compareTo(p2.getName());
}
}Übergeben Sie den Comparator an Sortiermethoden:
Collections.sort(people, new NameComparator());Sie können Lambda-Ausdrücke für prägnanten Code verwenden, da Comparator ein funktionales Interface ist:
Collections.sort(people, (p1, p2) -> p1.getName().compareTo(p2.getName()));Verwenden Sie zum Vergleichen numerischer Werte Wrapper-Klassenmethoden wie Double.compare() für einen sicheren Vergleich:
class AgeComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p1.getAge() - p2.getAge();
}
}Hauptunterschied: Comparable definiert eine natürliche Ordnung innerhalb der Klasse selbst, während Comparator eine separate Klasse ist, die unbegrenzt viele benutzerdefinierte Sortierungen extern definieren kann.
Probier es selbst
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Drei Mitarbeiter aus der Eingabe lesen
// Format jeder Zeile: Name,Abteilung,Gehalt
String line1 = scanner.nextLine();
String line2 = scanner.nextLine();
String line3 = scanner.nextLine();
// TODO: Jede Zeile parsen und Employee-Objekte erstellen
// Hinweis: Verwenden Sie split(","), um die Werte zu trennen
// TODO: Erstellen Sie eine ArrayList von Mitarbeitern und fügen Sie alle drei hinzu
// TODO: Nach Gehalt sortieren mit SalaryComparator und jeden Mitarbeiter ausgeben
// Hinweis: Verwenden Sie Collections.sort(list, comparator)
// TODO: Eine Leerzeile ausgeben
// TODO: Nach Name sortieren mit NameComparator und jeden Mitarbeiter ausgeben
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas this-SchlüsselwortMethodenFelder (Attribute)Konstruktor-MethodeKonstruktor-ÜberladungRückblick – Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (extends)Das super-SchlüsselwortMethoden überschreiben (@Override)Konstruktor-VerkettungDie Object-KlasseEinfache & mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenZusammenfassung - Mitarbeiter-Hierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-InterfaceZusammenfassung – Benutzerdefiniertes Sortieren2Zugriffsmodifikatoren & Kapselung
Überblick über ZugriffsebenenGetter- und Setter-MethodenInformation HidingDas final-SchlüsselwortRückblick – Bankkonto-Manager5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenZusammenfassung – Formenrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, geschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Sealed Classes (Java 17+)11Design Patterns Teil 1
Einführung in Design PatternsSingleton-PatternFactory-PatternBuilder-PatternObserver-PatternStrategy-Pattern14Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung3Klasseneigenschaften & Statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Zusammenfassung – Zähler & Utility6Interfaces & Abstrakte Klassen
Einführung in InterfacesInterfaces implementierenImplementierung mehrerer InterfacesDefault- & statische Methoden in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesZusammenfassung - Zahlungssystem