Интерфейс 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); // По убыванию
}Задание
ЛегкоДавайте создадим систему управления задачами, в которой задачи можно сортировать по уровню 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'с priority2'Fix critical bug'с priority5'Update documentation'с priority1'Review code'с priority3
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: Выведите каждую задачу в отсортированном списке
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыБиблиотеки и импортВведение в ООПКлассы и объектыКлючевое слово thisМетодыПеременные экземпляраОсновы конструкторовИтоги — Простой калькулятор4Null-безопасность
Введение в Null-безопасностьNullable и Non-Nullable типыОператоры ? и !Ключевое слово Late и Null-безопасностьNull-aware операторыNull-безопасность в классахИтоги — Система профилей пользователей7Абстрактные классы и интерфейсы
Абстрактные классыАбстрактные методыИнтерфейсы в DartНеявные интерфейсыРеализация против наследованияМножественные интерфейсыИтоги — Калькулятор фигур10Коллекции и обобщения
Обзор List, Set, MapТипобезопасные коллекцииОбобщенные классыОбобщенные методыОграничения обобщенийIterable и IteratorИтоги: Обобщенное хранилище13Продвинутые концепции ООП
Композиция против наследованияМетоды расширенияВызываемые классыЗапечатанные классы (Dart 3)Записи (Dart 3)Паттерны и сопоставление (3.0)Перечисления с методами16Проект: Управление библиотекой
Обзор проектаКлассы Book и User2Конструкторы в Dart
Конструктор по умолчаниюИменованные конструкторыСписки инициализацииКонстантные конструкторыФабричные конструкторыПеренаправляющие конструкторыИтоги — Shape Builder5Инкапсуляция
Публичные и приватные членыСоглашение о префиксе _Приватность на уровне библиотекГеттеры и сеттеры: подробный разборСкрытие данныхИтоги — Записи о студентах8Mixins
Введение в MixinsСоздание MixinsИспользование нескольких MixinsКлючевое слово on в MixinsMixin и наследованиеMixin и интерфейсИтоги: Система животных11Специальные методы
Переопределение toString()Переопределение hashCode и ==Интерфейс ComparableМетод call()Переопределение noSuchMethodПовторение — Пользовательская коллекция14Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy3Свойства классов
Члены экземпляра и статические членыПоля Final и ConstПеременные LateСтатические методы и поляГеттеры и сеттерыИтоги — Менеджер банковского счета6Наследование
Основы наследованияКлючевое слово superПереопределение методовАннотация @overrideКлючевое слово final для классовКонструкторы и наследованиеИтоги: Иерархия сотрудников9Полиморфизм
Основы полиморфизмаПолиморфизм через интерфейсыПроверка типов во время выполненияОператоры is и asКлючевое слово covariantИтоги — Обработчик платежей12Асинхронное ООП
Futures и async/awaitОсновы StreamsКонтроллеры StreamАсинхронные конструкторыАсинхронность в методах классовИтоги — Data Fetcher15Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн РепозиторийПотренируйтесь самостоятельно: Онлайн-компилятор Dart