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 Reihenfolge zu definieren. Durch die Implementierung dieses Interfaces kann deine Klasse automatisch mithilfe von Methoden wie Collections.sort() sortiert oder in sortierten Sammlungen wie TreeSet gespeichert werden.
Die Schnittstelle verlangt, dass du eine einzige Methode implementierst: compareTo(). Diese Methode vergleicht das aktuelle Objekt mit einem anderen Objekt und gibt eine Ganzzahl zurück, die ihre 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 Integer.compare(this.age, other.age); // Nach Alter aufsteigend sortieren
}
}Nach der Implementierung wird das Sortieren unkompliziert:
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
Collections.sort(people); // Jetzt sortiert nach Alter: Bob, AliceBeim Vergleichen von Zeichenketten oder anderen Comparable-Feldern kannst du deren Methode compareTo() verwenden, anstatt eine Subtraktion durchzuführen: return this.name.compareTo(other.name);. Dieser Ansatz ist sicherer und behandelt Sonderfälle korrekt. Für int-Felder solltest du Integer.compare(a, b) gegenüber a - b bevorzugen, da eine Subtraktion bei extremen Werten einen Überlauf verursachen kann.
Aufgabe
EinfachErstellen wir ein Film-Ranglistensystem, das die Schnittstelle Comparable verwendet, um Filme nach ihren Bewertungen zu sortieren. Du erstellst eine Klasse Movie, die weiß, wie sie sich mit anderen Filmen vergleichen kann, und dadurch eine automatische Sortierung von der höchsten zur niedrigsten Bewertung ermöglicht.
Du organisierst deinen Code auf zwei Dateien:
Movie.java: Erstelle 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üge einen Konstruktor hinzu, der alle Felder initialisiert, sowie Getter-Methoden für jedes Feld.Lass deine Movie-Klasse
Comparable<Movie>implementieren und überschreibe die MethodecompareTo(). Filme sollen nach ihrer Bewertung in absteigender Reihenfolge sortiert werden (höchste Bewertung zuerst). Verwende beim Vergleichen von double-WertenDouble.compare()für einen sicheren Vergleich: Denke daran, die Reihenfolge für eine absteigende Sortierung umzukehren!Überschreibe
toString(), sodass die Methode Folgendes zurückgibt:[title] by [director] - Rating: [rating]Main.java: Verwende deine Movie-Klasse, indem du eine Filmliste erstellst und sie sortierst. Du erhältst Eingaben für drei Filme, jeweils in einer eigenen Zeile und im Format:title,director,ratingVerarbeite jede Zeile, um Movie-Objekte zu erstellen, füge sie zu einer
ArrayListhinzu und verwende anschließendCollections.sort(), um die Liste zu sortieren. Dank deinerComparable-Implementierung ordnen sich die Filme automatisch nach ihrer Bewertung!Gib nach dem Sortieren jeden Film in einer eigenen Zeile und im
toString()-Format aus. Der Film mit der höchsten Bewertung soll zuerst erscheinen.
Du erhältst drei Eingabezeilen, die jeweils Filmdaten im Format title,director,rating enthalten.
Eine Eingabezeile könnte zum Beispiel so aussehen: Inception,Christopher Nolan,8.8
Denke daran, in deiner Main-Datei java.util.ArrayList, java.util.Collections und java.util.Scanner zu importieren. Beachte, dass die Implementierung von Comparable es dir ermöglicht, deine eigenen Objekte mit einem einzigen Methodenaufruf zu sortieren: Ein zusätzlicher Comparator ist nicht erforderlich!
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);
// Lies drei Zeilen mit Filmdaten
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)
// Hinweis: Verwende split(",") um die Teile zu trennen
// Hinweis: Verwende Double.parseDouble() für die Bewertung
// TODO: Erstelle Movie-Objekte und füge sie der Liste hinzu
// TODO: Sortiere die Liste mit Collections.sort()
// TODO: Gib jeden Film aus (einen 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 Schlüsselwort thisMethodenFelder (Attribute)KonstruktormethodeÜberladen von KonstruktorenRückblick – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbung (extends)Das Schlüsselwort superÜberschreiben von Methoden (@Override)KonstruktorverkettungDie Object-KlasseEinfach- und mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenRückblick – Mitarbeiterhierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-SchnittstelleRückblick – Benutzerdefinierte Sortierung2Zugriffsmodifikatoren & Kapselung
Übersicht der ZugriffsebenenGetter- und Setter-MethodenInformationsverbergungDas Schlüsselwort finalRückblick – Bankkontoverwaltung5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenRückblick – Formrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, verschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Versiegelte Klassen (Java 17+)11Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBuilder-MusterObserver-MusterStrategie-Muster14Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungsdienst3Klassen-Props & statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Wiederholung – Counter & Utility6Schnittstellen & abstrakte Klassen
Einführung in InterfacesInterfaces implementierenMehrere Interfaces implementierenDefault & Static in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesRückblick – ZahlungssystemÜbe selbstständig: Online-Java-Compiler