Menu
Coddy logo textTech

Interfejs Comparable

Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 72 z 110.

Chociaż == informuje, czy dwa obiekty są równe, czasami musisz wiedzieć, który z nich jest pierwszy. Interfejs Comparable pozwala sortować obiekty przez zdefiniowanie naturalnego porządku.

Aby klasa mogła być porównywana, zaimplementuj Comparable<T> i nadpisz metodę compareTo. Ta metoda zwraca liczbę ujemną, jeśli this występuje przed other, zero, jeśli są równe, i liczbę dodatnią, jeśli this występuje po other:

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
}

Gdy Twoja klasa implementuje Comparable, możesz użyć sort() bez podawania własnego komparatora. Wbudowane typy liczbowe i łańcuchów znaków już implementują Comparable, dlatego grade.compareTo(other.grade) działa bezpośrednio.

Aby uzyskać kolejność malejącą, po prostu odwróć porównanie, zamieniając obiekty miejscami lub negując wynik:

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

Wyzwanie

Łatwy

Zbudujmy system zarządzania zadaniami, w którym zadania można sortować według poziomu priorytetu! Utworzysz klasę Task, która implementuje interfejs Comparable, dzięki czemu lista zadań będzie automatycznie sortowana od najwyższego do najniższego priorytetu.

Podzielisz swój kod na dwa pliki:

  • task.dart: Utwórz klasę Task, która reprezentuje zadanie do wykonania, z właściwościami name (String) i priority (int, gdzie wyższe liczby oznaczają wyższy priorytet). Twoje zadanie powinno implementować Comparable<Task>, aby po sortowaniu zadania pojawiały się w kolejności malejącej według priorytetu (najpierw zadanie o najwyższym priorytecie). Nadpisz także toString(), aby zwracała format: [name] (Priority: [priority])
  • main.dart: Zaimportuj plik z zadaniami i pokaż, jak interfejs Comparable umożliwia automatyczne sortowanie. Utwórz listę zawierającą te cztery zadania:
    • 'Write report' o priorytecie 2
    • 'Fix critical bug' o priorytecie 5
    • 'Update documentation' o priorytecie 1
    • 'Review code' o priorytecie 3
    Wypisz Before sorting:, a następnie wypisz każde zadanie. Posortuj listę za pomocą sort(), wypisz pustą linię, a następnie wypisz After sorting:, po którym ponownie wypisz każde zadanie.

Ponieważ klasa Task implementuje Comparable, możesz bezpośrednio wywołać sort() na liście, bez przekazywania własnego komparatora. Zadania zostaną automatycznie uporządkowane na podstawie implementacji compareTo!

Oczekiwany wynik:

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)

Spróbuj swoich sił

import 'task.dart';

void main() {
  // TODO: Utwórz listę obiektów Task zawierającą:
  // - 'Write report' z priorytetem 2
  // - 'Fix critical bug' z priorytetem 5
  // - 'Update documentation' z priorytetem 1
  // - 'Review code' z priorytetem 3
  
  List<Task> tasks = [
    // TODO: Dodaj tutaj cztery zadania
  ];
  
  // TODO: Wypisz "Before sorting:"
  // TODO: Wypisz każde zadanie z listy
  
  // TODO: Posortuj listę za pomocą sort()
  
  // TODO: Wypisz pusty wiersz
  
  // TODO: Wypisz "After sorting:"
  // TODO: Wypisz każde zadanie z posortowanej listy
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Dart online