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
}Aufgabe
EinfachErstellen 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 eineTask-Klasse, die eine zu erledigende Aufgabe mit einemname(String) und einerpriority(int, wobei höhere Zahlen eine höhere Priorität bedeuten) darstellt. Deine Aufgabe sollteComparable<Task>implementieren, sodass Aufgaben beim Sortieren in absteigender Reihenfolge nach Priorität erscheinen (höchste Priorität zuerst). Überschreibe außerdemtoString(), sodass das folgende Format zurückgegeben wird:[name] (Priority: [priority])main.dart: Importiere deine Aufgabendatei und zeige, wie dieComparable-Schnittstelle die automatische Sortierung ermöglicht. Erstelle eine Liste mit diesen vier Aufgaben:'Write report'mit der Priorität2'Fix critical bug'mit der Priorität5'Update documentation'mit der Priorität1'Review code'mit der Priorität3
Before sorting:aus und anschließend jede Aufgabe. Sortiere die Liste mitsort(), gib eine leere Zeile aus und gib dannAfter 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
}
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 DateienBibliotheken & ImportsEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort thisMethodenInstanzvariablenGrundlagen von KonstruktorenRückblick – Einfacher Taschenrechner4Null-Sicherheit
Einführung in die Null-SicherheitNullable vs. Non-NullableDie Operatoren ? und !Late-Schlüsselwort und Null-SicherheitNull-bewusste OperatorenNull-Sicherheit in KlassenRückblick – Benutzers профilsystem7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrere InterfacesZusammenfassung – Formrechner10Collections & Generics
Übersicht über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische EinschränkungenIterable & IteratorRückblick – Generischer Speicher13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungErweiterungsmethodenAufrufbare KlassenVersiegelte Klassen (Dart 3)Records (Dart 3)Muster & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
StandardkonstruktorBenannte KonstruktorenInitialisierungslistenKonstantenkonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenRückblick – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _-Präfix-KonventionBibliotheksweite SichtbarkeitTiefergehende Getter & SetterInformationsverbergungRückblick – Studierendendaten8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas Schlüsselwort „on“ in MixinsMixin vs. VererbungMixin vs. SchnittstelleRückblick – Tiersystem11Spezielle Methoden
toString()-ÜberschreibunghashCode- & ==-ÜberschreibungComparable-Schnittstellecall()-MethodenoSuchMethod-ÜberschreibungWiederholung – Benutzerdefinierte Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFabrikmusterBeobachtermusterStrategiemuster17Abschließende Herausforderungen
E-Learning-PlattformBankingsystemSpielcharaktersystemFahrzeugvermietung3Klassen-Eigenschaften
Instanz- vs. statische MemberFinal- und Const-FelderLate-VariablenStatische Methoden und FelderGetter und SetterRückblick – Bankkontoverwaltung6Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungDie Annotation @overrideDas Schlüsselwort final für KlassenKonstruktoren und VererbungZusammenfassung – Mitarbeiterhierarchie9Polymorphismus
Grundlagen des PolymorphismusPolymorphismus über InterfacesLaufzeit-TypüberprüfungDie Operatoren is & asCovariant-SchlüsselwortZusammenfassung – ZahlungsprozessorÜbe selbstständig: Online-Dart-Compiler