Обзор List, Set, Map
Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy. Урок 63 из 110.
Dart предоставляет три основных типа коллекций, которые вы будете постоянно использовать при создании приложений. Каждый из них служит разным целям для организации и доступа к данным.
Список (List) — это упорядоченная коллекция, в которой доступ к элементам осуществляется по индексу. Элементы сохраняют порядок вставки, и допускаются дубликаты:
var fruits = ['apple', 'banana', 'apple'];
print(fruits[0]); // apple
print(fruits.length); // 3Множество (Set) — это неупорядоченная коллекция уникальных элементов. Если вы попытаетесь добавить дубликат, он будет просто проигнорирован:
var uniqueNumbers = {1, 2, 3, 2, 1};
print(uniqueNumbers); // {1, 2, 3}Map хранит пары ключ-значение, позволяя искать значения по связанному с ними ключу:
var ages = {'Alice': 30, 'Bob': 25};
print(ages['Alice']); // 30Вот краткое сравнение:
| Коллекция | Упорядоченность | Дубликаты | Доступ по |
|---|---|---|---|
| List | Да | Разрешены | Индексу |
| Set | Нет | Не разрешены | Проверке наличия |
| Map | Нет* | Уникальным ключам | Ключу |
Эти коллекции становятся еще более мощными в сочетании с обобщениями (generics), которые вы изучите в следующих уроках, чтобы создавать типобезопасные коллекции, работающие с вашими пользовательскими классами.
Задание
ЛегкоДавайте создадим систему управления классом, которая использует все три типа коллекций для организации данных об учениках различными способами. Вы увидите, как списки (Lists), множества (Sets) и словари (Maps) служат разным целям при управлении одной и той же информацией.
Вы организуете свой код в два файла:
classroom.dart: Создайте классClassroom, который управляет данными учеников, используя все три типа коллекций:List<String>с именемattendanceOrderдля отслеживания учеников в порядке их прибытия (дубликаты разрешены, если ученик отметился несколько раз)Set<String>с именемuniqueStudentsдля отслеживания того, какие именно ученики присутствуют (без дубликатов)Map<String, int>с именемscoresдля хранения тестовых баллов каждого ученика
recordArrival(String name)— добавляет имя как в список посещаемости, так и в множество уникальных учениковsetScore(String name, int score)— сохраняет балл ученика в словаре (map)printReport()— выводит отчет о классе (формат показан ниже)
main.dart: Импортируйте файл classroom и продемонстрируйте работу системы:- Создайте экземпляр
Classroom - Запишите прибытие в следующем порядке:
'Alice','Bob','Alice','Carol','Bob' - Установите баллы: Alice =
95, Bob =87, Carol =92 - Вызовите
printReport()
- Создайте экземпляр
Метод printReport() должен выводить:
Arrival Order: [Alice, Bob, Alice, Carol, Bob]
Unique Students: {Alice, Bob, Carol}
Scores: {Alice: 95, Bob: 87, Carol: 92}Обратите внимание, как List сохраняет каждое прибытие (включая дубликаты), Set автоматически оставляет только уникальные имена, а Map связывает каждого ученика с его баллом. Каждый тип коллекции идеально выполняет свою задачу!
Ожидаемый вывод:
Arrival Order: [Alice, Bob, Alice, Carol, Bob]
Unique Students: {Alice, Bob, Carol}
Scores: {Alice: 95, Bob: 87, Carol: 92}Попробуйте сами
import 'classroom.dart';
void main() {
// TODO: Создайте экземпляр Classroom
// TODO: Запишите прибытие в следующем порядке: 'Alice', 'Bob', 'Alice', 'Carol', 'Bob'
// TODO: Установите баллы: Alice = 95, Bob = 87, Carol = 92
// TODO: Вызовите printReport() для отображения данных класса
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
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