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

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

challenge icon

Aufgabe

Einfach

Erstellen 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) und rating (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 Methode compareTo(). Filme sollen nach ihrer Bewertung in absteigender Reihenfolge sortiert werden (höchste Bewertung zuerst). Verwende beim Vergleichen von double-Werten Double.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,rating

    Verarbeite jede Zeile, um Movie-Objekte zu erstellen, füge sie zu einer ArrayList hinzu und verwende anschließend Collections.sort(), um die Liste zu sortieren. Dank deiner Comparable-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)
    }
}
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

Übe selbstständig: Online-Java-Compiler