Обзор 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}Шпаргалка
Dart предоставляет три основных типа коллекций для организации данных:
List — это упорядоченная коллекция, в которой доступ к элементам осуществляется по индексу. Дубликаты разрешены:
var fruits = ['apple', 'banana', 'apple'];
print(fruits[0]); // apple
print(fruits.length); // 3Set — это неупорядоченная коллекция уникальных элементов. Дубликаты автоматически игнорируются:
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 | Нет* | Уникальные ключи | Ключу |
Попробуйте сами
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
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий