compareTo() und Comparable
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy — Lektion 44 von 87.
Das Comparable-Interface ermöglicht es Objekten, ihre natürliche Ordnung zu definieren. Durch das Implementieren dieses Interfaces kann Ihre Klasse automatisch mit Methoden wie Collections.sort() sortiert oder in sortierten Collections wie TreeSet gespeichert werden.
Die Schnittstelle erfordert, dass Sie eine einzige Methode implementieren: compareTo(). Diese Methode vergleicht das aktuelle Objekt mit einem anderen Objekt und gibt eine Ganzzahl zurück, die deren relative Reihenfolge angibt:
- Negativer Wert: dieses Objekt kommt vor dem anderen
- Null: beide Objekte sind gleich
- Positiver Wert: dieses Objekt kommt nach dem anderen
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person other) {
return this.age - other.age; // Nach Alter aufsteigend sortieren
}
}Nach der Implementierung wird das Sortieren einfach:
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
Collections.sort(people); // Jetzt nach Alter sortiert: Bob, AliceZum Vergleichen von Strings oder anderen Comparable-Feldern können Sie an deren compareTo()-Methode delegieren, anstatt Subtraktion zu verwenden: return this.name.compareTo(other.name);. Dieser Ansatz ist sicherer und behandelt Sonderfälle korrekt.
Aufgabe
EinfachLassen Sie uns ein Film-Ranking-System erstellen, das das Comparable-Interface verwendet, um Filme nach ihren Bewertungen zu sortieren. Sie werden eine Movie-Klasse erstellen, die weiß, wie sie sich mit anderen Filmen vergleicht, was eine automatische Sortierung von der höchsten zur niedrigsten Bewertung ermöglicht.
Sie werden Ihren Code auf zwei Dateien aufteilen:
Movie.java: Erstellen Sie eine Klasse, die einen Film repräsentiert und mit anderen Filmen verglichen werden kann. Ein Movie hat drei private Felder:title(String),director(String) undrating(double, von 0.0 bis 10.0). Fügen Sie einen Konstruktor zur Initialisierung aller Felder und Getter-Methoden für jedes Feld hinzu.Lassen Sie Ihre Movie-Klasse
Comparable<Movie>implementieren und überschreiben Sie diecompareTo()-Methode. Filme sollten nach Bewertung in absteigender Reihenfolge (höchste Bewertung zuerst) sortiert werden. Verwenden Sie beim Vergleich von DoublesDouble.compare()für einen sicheren Vergleich – denken Sie daran, die Reihenfolge für die absteigende Sortierung umzukehren!Überschreiben Sie
toString(), um Folgendes zurückzugeben:[title] by [director] - Rating: [rating]Main.java: Erwecken Sie Ihre Movie-Klasse zum Leben, indem Sie eine Liste von Filmen erstellen und diese sortieren. Sie erhalten Eingaben für drei Filme, jeweils in einer separaten Zeile im Format:title,director,ratingAnalysieren Sie jede Zeile, um Movie-Objekte zu erstellen, fügen Sie diese einer
ArrayListhinzu und verwenden Sie dannCollections.sort(), um die Liste zu sortieren. Dank IhrerComparable-Implementierung ordnen sich die Filme automatisch nach ihrer Bewertung an!Geben Sie nach der Sortierung jeden Film in einer eigenen Zeile im
toString()-Format aus. Der am höchsten bewertete Film sollte zuerst erscheinen.
Sie erhalten drei Eingabezeilen, die jeweils Filmdaten im Format title,director,rating enthalten.
Ein Beispiel für eine Eingabezeile könnte so aussehen: Inception,Christopher Nolan,8.8
Vergessen Sie nicht, java.util.ArrayList, java.util.Collections und java.util.Scanner in Ihrer Main-Datei zu importieren. Beachten Sie, wie die Implementierung von Comparable es Ihnen ermöglicht, Ihre benutzerdefinierten Objekte mit einem einzigen Methodenaufruf zu sortieren – kein zusätzlicher Comparator erforderlich!
Spickzettel
Das Comparable-Interface ermöglicht es Objekten, ihre natürliche Ordnung für die automatische Sortierung zu definieren.
Implementieren Sie die compareTo()-Methode, die Folgendes zurückgibt:
- Negativer Wert: Dieses Objekt kommt vor dem anderen
- Null: Beide Objekte sind gleich
- Positiver Wert: Dieses Objekt kommt nach dem anderen
public class Person implements Comparable<Person> {
private int age;
@Override
public int compareTo(Person other) {
return this.age - other.age; // Sort by age ascending
}
}Sortieren Sie Objekte mit Collections.sort():
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
Collections.sort(people); // Sorted by ageUm Strings zu vergleichen, delegieren Sie an deren compareTo()-Methode:
return this.name.compareTo(other.name);Um Doubles sicher zu vergleichen, verwenden Sie Double.compare():
return Double.compare(this.rating, other.rating); // Ascending
return Double.compare(other.rating, this.rating); // DescendingProbier 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);
// Lies drei Zeilen mit Filmdaten ein
String line1 = scanner.nextLine();
String line2 = scanner.nextLine();
String line3 = scanner.nextLine();
// TODO: Erstelle eine ArrayList, um Movie-Objekte zu speichern
// TODO: Parse jede Zeile (Format: title,director,rating)
// Hint: Verwende split(","), um die Teile zu trennen
// Hint: Verwende Double.parseDouble() für das rating
// TODO: Erstelle Movie-Objekte und füge sie der Liste hinzu
// TODO: Sortiere die Liste mit Collections.sort()
// TODO: Gib jeden Film aus (einer pro Zeile)
}
}
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