Menu
Coddy logo textTech

Comparable-Interface

Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy — Lektion 72 von 110.

Während == Ihnen sagt, ob zwei Objekte gleich sind, müssen Sie manchmal wissen, welches zuerst kommt. Das Comparable-Interface ermöglicht es, Ihre Objekte zu sortieren, indem eine natürliche Ordnung definiert wird.

Um eine Klasse vergleichbar zu machen, implementieren Sie Comparable<T> und überschreiben Sie die Methode compareTo. Diese Methode gibt eine negative Zahl zurück, wenn this vor other kommt, Null, wenn sie gleich sind, und eine positive Zahl, wenn this danach kommt:

class Student implements Comparable<Student> {
  String name;
  int grade;
  
  Student(this.name, this.grade);
  
  @override
  int compareTo(Student other) {
    return grade.compareTo(other.grade);
  }
}

void main() {
  var students = [
    Student('Alice', 85),
    Student('Bob', 92),
    Student('Carol', 78),
  ];
  
  students.sort();
  
  for (var s in students) {
    print('${s.name}: ${s.grade}');
  }
  // Carol: 78, Alice: 85, Bob: 92
}

Sobald Ihre Klasse Comparable implementiert, können Sie sort() verwenden, ohne einen benutzerdefinierten Comparator bereitzustellen. Die integrierten numerischen Typen und String-Typen implementieren bereits Comparable, weshalb grade.compareTo(other.grade) direkt funktioniert.

Für eine absteigende Sortierung kehren Sie den Vergleich einfach um, indem Sie die Objekte vertauschen oder das Ergebnis negieren:

@override
int compareTo(Student other) {
  return other.grade.compareTo(grade);  // Absteigend
}
challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Aufgabenverwaltungssystem erstellen, bei dem Aufgaben nach ihrer Prioritätsstufe sortiert werden können! Sie werden eine Task-Klasse erstellen, die das Comparable-Interface implementiert, sodass eine Liste von Aufgaben automatisch von der höchsten zur niedrigsten Priorität sortiert werden kann.

Sie werden Ihren Code in zwei Dateien organisieren:

  • task.dart: Erstellen Sie eine Task-Klasse, die ein To-do-Element mit einem name (String) und einer priority (int, wobei höhere Zahlen eine höhere Priorität bedeuten) darstellt. Ihre Aufgabe sollte Comparable<Task> implementieren, damit Aufgaben beim Sortieren in absteigender Reihenfolge nach Priorität erscheinen (höchste Priorität zuerst). Überschreiben Sie außerdem toString(), um das Format: [name] (Priority: [priority]) zurückzugeben.
  • main.dart: Importieren Sie Ihre Aufgabendatei und demonstrieren Sie, wie das Comparable-Interface die automatische Sortierung ermöglicht. Erstellen Sie eine Liste mit diesen vier Aufgaben:
    • 'Write report' mit Priorität 2
    • 'Fix critical bug' mit Priorität 5
    • 'Update documentation' mit Priorität 1
    • 'Review code' mit Priorität 3
    Geben Sie Before sorting: aus, und drucken Sie dann jede Aufgabe. Sortieren Sie die Liste mit sort(), geben Sie eine Leerzeile aus und drucken Sie dann After sorting: gefolgt von jeder Aufgabe erneut.

Da Ihre Task-Klasse Comparable implementiert, können Sie sort() direkt auf der Liste aufrufen, ohne einen benutzerdefinierten Comparator anzugeben. Die Aufgaben ordnen sich basierend auf Ihrer compareTo-Implementierung automatisch selbst an!

Erwartete Ausgabe:

Before sorting:
Write report (Priority: 2)
Fix critical bug (Priority: 5)
Update documentation (Priority: 1)
Review code (Priority: 3)

After sorting:
Fix critical bug (Priority: 5)
Review code (Priority: 3)
Write report (Priority: 2)
Update documentation (Priority: 1)

Spickzettel

Das Comparable-Interface ermöglicht es Objekten, eine natürliche Ordnung für die Sortierung zu definieren. Implementieren Sie Comparable<T> und überschreiben Sie die compareTo-Methode.

Die compareTo-Methode gibt Folgendes zurück:

  • Eine negative Zahl, wenn this vor other kommt
  • Null, wenn sie gleich sind
  • Eine positive Zahl, wenn this nach other kommt

Grundlegende Implementierung (aufsteigende Reihenfolge):

class Student implements Comparable<Student> {
  String name;
  int grade;
  
  Student(this.name, this.grade);
  
  @override
  int compareTo(Student other) {
    return grade.compareTo(other.grade);
  }
}

Sobald eine Klasse Comparable implementiert, können Sie sort() ohne einen benutzerdefinierten Komparator verwenden:

var students = [
  Student('Alice', 85),
  Student('Bob', 92),
  Student('Carol', 78),
];

students.sort();  // Verwendet automatisch compareTo

Für eine absteigende Reihenfolge kehren Sie den Vergleich um:

@override
int compareTo(Student other) {
  return other.grade.compareTo(grade);  // Absteigend
}

Probier es selbst

import 'task.dart';

void main() {
  // TODO: Erstelle eine Liste von Task-Objekten mit folgendem Inhalt:
  // - 'Write report' mit Priorität 2
  // - 'Fix critical bug' mit Priorität 5
  // - 'Update documentation' mit Priorität 1
  // - 'Review code' mit Priorität 3
  
  List<Task> tasks = [
    // TODO: Füge die vier Aufgaben hier hinzu
  ];
  
  // TODO: Gib "Before sorting:" aus
  // TODO: Gib jede Aufgabe in der Liste aus
  
  // TODO: Sortiere die Liste mit sort()
  
  // TODO: Gib eine Leerzeile aus
  
  // TODO: Gib "After sorting:" aus
  // TODO: Gib jede Aufgabe in der sortierten Liste aus
}
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