Menu
Coddy logo textTech

Интерфейс Comparable

Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy. Урок 72 из 110.

Хотя == сообщает, равны ли два объекта, иногда нужно знать, какой из них идет первым. Интерфейс Comparable позволяет сортировать ваши объекты, определяя естественный порядок.

Чтобы сделать class сопоставимым, реализуйте Comparable<T> и выполните override метода compareTo. Этот метод возвращает отрицательное число, если this находится перед other, ноль, если они равны, и положительное число, если this находится после:

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
}

После того как ваш class реализует Comparable, вы можете использовать sort(), не предоставляя пользовательский компаратор. Встроенные числовые типы и типы строк уже реализуют Comparable, поэтому grade.compareTo(other.grade) работает напрямую.

Для порядка descending просто измените направление сравнения, поменяв объекты местами или инвертировав результат:

@override
int compareTo(Student other) {
  return other.grade.compareTo(grade);  // По убыванию
}
challenge icon

Задание

Легко

Давайте создадим систему управления задачами, в которой задачи можно сортировать по уровню priority! Вы создадите класс Task, реализующий интерфейс Comparable, что позволит автоматически сортировать список задач от самого высокого к самому низкому priority.

Вы организуете код в двух файлах:

  • task.dart: Создайте класс Task, представляющий элемент списка дел с name (String) и priority (int, где большие числа означают более высокий priority). Ваш класс Task должен реализовывать Comparable<Task>, чтобы при сортировке задачи располагались в descending order по priority (сначала самый высокий priority). Также переопределите toString(), чтобы он возвращал формат: [name] (Priority: [priority])
  • main.dart: Импортируйте файл с задачей и продемонстрируйте, как интерфейс Comparable обеспечивает Automatic сортировку. Создайте список, содержащий эти четыре задачи:
    • 'Write report' с priority 2
    • 'Fix critical bug' с priority 5
    • 'Update documentation' с priority 1
    • 'Review code' с priority 3
    Выведите Before sorting:, затем выведите каждую задачу. Отсортируйте список с помощью sort(), выведите пустую строку, затем снова выведите After sorting:, а после него — каждую задачу.

Поскольку ваш класс Task реализует Comparable, вы можете напрямую вызвать sort() для списка, не предоставляя пользовательский компаратор. Задачи автоматически упорядочатся на основе вашей реализации compareTo!

Ожидаемый результат:

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)

Попробуйте сами

import 'task.dart';

void main() {
  // TODO: Создайте список объектов Task со следующим:
  // - 'Write report' с приоритетом 2
  // - 'Fix critical bug' with priority 5
  // - 'Update documentation' with priority 1
  // - 'Review code' с приоритетом 3
  
  List<Task> tasks = [
    // TODO: Добавьте четыре задачи здесь
  ];
  
  // TODO: Print "Before sorting:"
  // TODO: Выведите каждую задачу в списке
  
  // TODO: Отсортируйте список с помощью sort()
  
  // TODO: Выведите пустую строку
  
  // TODO: Print "After sorting:"
  // TODO: Выведите каждую задачу в отсортированном списке
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Dart