Menu
Coddy logo textTech

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, Alice

Zum 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.

challenge icon

Aufgabe

Einfach

Lassen 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) und rating (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 die compareTo()-Methode. Filme sollten nach Bewertung in absteigender Reihenfolge (höchste Bewertung zuerst) sortiert werden. Verwenden Sie beim Vergleich von Doubles Double.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,rating

    Analysieren Sie jede Zeile, um Movie-Objekte zu erstellen, fügen Sie diese einer ArrayList hinzu und verwenden Sie dann Collections.sort(), um die Liste zu sortieren. Dank Ihrer Comparable-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 age

Um 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);  // Descending

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 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)
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung