Свойства Map: keys и values
Часть раздела Логика и управление потоком путешествия по Dart на Coddy — урок 28 из 65.
При работе с коллекциями Map вам иногда может потребоваться извлечь все ключи или все значения по отдельности. Dart предоставляет для этого два удобных свойства: .keys и .values.
Свойство .keys возвращает итерируемый объект, содержащий все ключи из коллекции map, в то время как .values возвращает итерируемый объект, содержащий все соответствующие значения. Эти свойства особенно полезны, когда вам нужно обрабатывать ключи и значения независимо друг от друга.
Map<String, double> inventory = {
'Laptop': 999.99,
'Mouse': 25.50,
'Keyboard': 75.00
};
Iterable<String> productNames = inventory.keys;
Iterable<double> prices = inventory.values;
print(productNames); // (Laptop, Mouse, Keyboard)
print(prices); // (999.99, 25.5, 75.0)Поскольку эти свойства возвращают итерируемые объекты, а не списки, вы можете преобразовать их в списки с помощью .toList(), если вам нужна функциональность, специфичная для списков. Такое разделение ключей и значений особенно полезно, когда вам нужно проанализировать или обработать один аспект ваших данных независимо от другого.
Задание
ЛегкоСоздайте программу, которая управляет системой цифровой библиотеки, анализируя коллекции книг и извлекая информацию о названиях и годах их публикации. Ваша программа должна:
- Прочитать строковый ввод, представляющий название библиотеки
- Прочитать несколько пар входных данных, представляющих названия книг и годы их публикации (ввод закончится, когда вы получите
"catalog_done") - Создать Map для хранения названия каждой книги в качестве ключа и года ее публикации в качестве значения
- Использовать свойство
.keysдля извлечения всех названий книг и преобразовать их в List - Использовать свойство
.valuesдля извлечения всех годов публикации и преобразовать их в List - Найти самую старую книгу, определив минимальный год из значений
- Найти самую новую книгу, определив максимальный год из значений
- Вывести анализ библиотеки в точном формате, показанном ниже
Например, если название библиотеки — "Central Library", а каталог включает "To Kill a Mockingbird" с годом 1960, "1984" с годом 1949, "The Great Gatsby" с годом 1925, "Harry Potter" с годом 1997, ваша программа должна вывести:
Library: Central Library
Book Collection Analysis:
All book titles: [To Kill a Mockingbird, 1984, The Great Gatsby, Harry Potter]
All publication years: [1960, 1949, 1925, 1997]
Total books in collection: 4
Oldest book year: 1925
Newest book year: 1997
Collection span: 72 years
Status: Library catalog analysis completedЕсли название библиотеки — "University Library", а каталог включает "Pride and Prejudice" с годом 1813, "Moby Dick" с годом 1851, "Brave New World" с годом 1932, ваша программа должна вывести:
Library: University Library
Book Collection Analysis:
All book titles: [Pride and Prejudice, Moby Dick, Brave New World]
All publication years: [1813, 1851, 1932]
Total books in collection: 3
Oldest book year: 1813
Newest book year: 1932
Collection span: 119 years
Status: Library catalog analysis completedЕсли название библиотеки — "Community Library", а каталог включает "The Hobbit" с годом 1937, "Dune" с годом 1965, "Neuromancer" с годом 1984, "The Martian" с годом 2011, "Klara and the Sun" с годом 2021, ваша программа должна вывести:
Library: Community Library
Book Collection Analysis:
All book titles: [The Hobbit, Dune, Neuromancer, The Martian, Klara and the Sun]
All publication years: [1937, 1965, 1984, 2011, 2021]
Total books in collection: 5
Oldest book year: 1937
Newest book year: 2021
Collection span: 84 years
Status: Library catalog analysis completedВаша программа должна использовать свойство .keys для извлечения всех названий книг и свойство .values для извлечения всех годов публикации. Преобразуйте оба итерируемых объекта в списки с помощью .toList(). Рассчитайте охват коллекции, вычтя самый старый год из самого нового. Формат ввода будет следующим: название библиотеки, затем чередующиеся названия книг и годы публикации (в виде строк, которые необходимо преобразовать в целые числа), заканчивающиеся строкой "catalog_done".
Шпаргалка
Используйте .keys для извлечения всех ключей из Map и .values для извлечения всех значений:
Map<String, double> inventory = {
'Laptop': 999.99,
'Mouse': 25.50,
'Keyboard': 75.00
};
Iterable<String> productNames = inventory.keys;
Iterable<double> prices = inventory.values;
print(productNames); // (Laptop, Mouse, Keyboard)
print(prices); // (999.99, 25.5, 75.0)Преобразуйте итерируемые объекты в списки с помощью .toList() для использования функционала, специфичного для списков:
List<String> namesList = inventory.keys.toList();
List<double> pricesList = inventory.values.toList();Попробуйте сами
import 'dart:io';
void main() {
// Прочитать название библиотеки
String? libraryName = stdin.readLineSync();
// Создать Map для хранения названий книг и годов издания
Map<String, int> bookCatalog = {};
// Читать названия книг и годы до "catalog_done"
while (true) {
String? input = stdin.readLineSync();
if (input == "catalog_done") {
break;
}
String bookTitle = input!;
String? yearInput = stdin.readLineSync();
int publicationYear = int.parse(yearInput!);
bookCatalog[bookTitle] = publicationYear;
}
// TODO: Напишите свой код ниже
// Извлечь названия книг с помощью свойства .keys и преобразовать в List
// Извлечь годы издания с помощью свойства .values и преобразовать в List
// Найти самый старый и самый новый годы
// Рассчитать охват коллекции
// Вывести анализ библиотеки в требуемом формате
print("Library: $libraryName");
print("Book Collection Analysis:");
// Добавьте ваши операторы вывода здесь
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутая работа со списками
Свойства списка: first и lastСостояние списка: isEmpty и isNotEmptyРазворот спискаДобавление в список: insertУдаление из списка: removeWhereПоиск в списке: indexOfСортировка спискаПеремешивание спискаИтоги — Органайзер списков4Продвинутая работа с Map
Итерация по MapПроверка ключей и значенийСвойства Map: keys и valuesУсловное добавление: putIfAbsentУдаление записей из MapВложенные MapИтоги — Обновление инвентаря2Функциональные операции со списками
Преобразование с помощью 'map'Фильтрация с помощью 'where'Использование '.toList()'Проверка условий с помощью 'any'Условия с 'every'Поиск с помощью 'firstWhere'Повторение — фильтрация данных5Проект: Калькулятор корзины
Настройка проектаДобавление товаров в корзину3Множества
Что такое множество?Создание множестваДобавление и удаление элементовПроверка наличия элементов в множествеПреобразование списка в множествоОбъединение множествПересечение множествРазность множествИтоги: уникальный список гостей