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
}Aufgabe
EinfachLassen 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 eineTask-Klasse, die ein To-do-Element mit einemname(String) und einerpriority(int, wobei höhere Zahlen eine höhere Priorität bedeuten) darstellt. Ihre Aufgabe sollteComparable<Task>implementieren, damit Aufgaben beim Sortieren in absteigender Reihenfolge nach Priorität erscheinen (höchste Priorität zuerst). Überschreiben Sie außerdemtoString(), um das Format:[name] (Priority: [priority])zurückzugeben.main.dart: Importieren Sie Ihre Aufgabendatei und demonstrieren Sie, wie dasComparable-Interface die automatische Sortierung ermöglicht. Erstellen Sie eine Liste mit diesen vier Aufgaben:'Write report'mit Priorität2'Fix critical bug'mit Priorität5'Update documentation'mit Priorität1'Review code'mit Priorität3
Before sorting:aus, und drucken Sie dann jede Aufgabe. Sortieren Sie die Liste mitsort(), geben Sie eine Leerzeile aus und drucken Sie dannAfter 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
thisvorotherkommt - Null, wenn sie gleich sind
- Eine positive Zahl, wenn
thisnachotherkommt
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 compareToFü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
}
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 this-SchlüsselwortMethodenInstanzvariablenKonstruktor-GrundlagenWiederholung – Einfacher Taschenrechner4Null-Sicherheit
Einführung in Null-SicherheitNullable vs. Non-NullableDie ? und ! OperatorenLate-Schlüsselwort & Null-SicherheitNull-aware OperatorenNull-Sicherheit in KlassenZusammenfassung – Benutzerprofil-System7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrfache InterfacesRückblick – Shape Calculator10Collections & Generics
Überblick über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische ConstraintsIterable & IteratorZusammenfassung – Generische Speicherung13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungExtension MethodsCallable ClassesSealed Classes (Dart 3)Records (Dart 3)Patterns & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
Standard-KonstruktorBenannte KonstruktorenInitialisierungslistenKonstante KonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenZusammenfassung – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _ Präfix-KonventionSichtbarkeit auf Library-EbeneGetter & Setter im DetailInformation HidingRückblick – Schülerdatensätze8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas on-Schlüsselwort in MixinsMixin vs. VererbungMixin vs. InterfaceZusammenfassung - Tiersystem11Spezielle Methoden
toString() überschreibenhashCode & == überschreibenComparable-Interfacecall()-MethodenoSuchMethod überschreibenZusammenfassung – Eigene Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster3Klasseneigenschaften
Instanz- vs. statische MemberFinal & Const FelderLate-VariablenStatische Methoden & FelderGetter und SetterZusammenfassung – Bankkonto-Manager6Vererbung
Grundlagen der VererbungDas super-SchlüsselwortMethoden überschreibenDie @override-AnnotationDas final-Klassen-SchlüsselwortKonstruktoren & VererbungRückblick – Mitarbeiter-Hierarchie9Polymorphismus
Polymorphismus-GrundlagenPolymorphismus über InterfacesTypprüfung zur LaufzeitDie is & as OperatorenDas covariant SchlüsselwortZusammenfassung – Payment Processor