Menu
Coddy logo textTech

Comparable-Schnittstelle

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

Während == dir sagt, ob zwei Objekte gleich sind, musst du manchmal wissen, welches zuerst kommt. Das Interface Comparable ermöglicht es, deine Objekte zu sortieren, indem es eine natürliche Reihenfolge definiert.

Um eine Klasse vergleichbar zu machen, implementiere Comparable<T> und überschreibe 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 deine Klasse Comparable implementiert, kannst du sort() verwenden, ohne einen eigenen Komparator bereitzustellen. Die integrierten numerischen Typen und String-Typen implementieren bereits Comparable, weshalb grade.compareTo(other.grade) direkt funktioniert.

Für eine absteigende Reihenfolge kehrst du den Vergleich einfach um, indem du die Objekte vertauschst oder das Ergebnis negierst:

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

Aufgabe

Einfach

Erstellen wir ein Aufgabenverwaltungssystem, in dem Aufgaben nach ihrer Prioritätsstufe sortiert werden können! Du erstellst eine Task-Klasse, die die Comparable-Schnittstelle implementiert, sodass eine Liste von Aufgaben automatisch von der höchsten zur niedrigsten Priorität sortiert werden kann.

Du organisierst deinen Code in zwei Dateien:

  • task.dart: Erstelle eine Task-Klasse, die eine zu erledigende Aufgabe mit einem name (String) und einer priority (int, wobei höhere Zahlen eine höhere Priorität bedeuten) darstellt. Deine Aufgabe sollte Comparable<Task> implementieren, sodass Aufgaben beim Sortieren in absteigender Reihenfolge nach Priorität erscheinen (höchste Priorität zuerst). Überschreibe außerdem toString(), sodass das folgende Format zurückgegeben wird: [name] (Priority: [priority])
  • main.dart: Importiere deine Aufgabendatei und zeige, wie die Comparable-Schnittstelle die automatische Sortierung ermöglicht. Erstelle eine Liste mit diesen vier Aufgaben:
    • 'Write report' mit der Priorität 2
    • 'Fix critical bug' mit der Priorität 5
    • 'Update documentation' mit der Priorität 1
    • 'Review code' mit der Priorität 3
    Gib Before sorting: aus und anschließend jede Aufgabe. Sortiere die Liste mit sort(), gib eine leere Zeile aus und gib dann After sorting: aus, gefolgt von jeder Aufgabe.

Da deine Task-Klasse Comparable implementiert, kannst du sort() direkt für die Liste aufrufen, ohne einen benutzerdefinierten Vergleicher bereitzustellen. Die Aufgaben werden automatisch anhand deiner Implementierung von compareTo angeordnet!

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)

Probier es selbst

import 'task.dart';

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

Übe selbstständig: Online-Dart-Compiler