Menu
Coddy logo textTech

Свойства 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(), если вам нужна функциональность, специфичная для списков. Такое разделение ключей и значений особенно полезно, когда вам нужно проанализировать или обработать один аспект ваших данных независимо от другого.

challenge icon

Задание

Легко

Создайте программу, которая управляет системой цифровой библиотеки, анализируя коллекции книг и извлекая информацию о названиях и годах их публикации. Ваша программа должна:

  1. Прочитать строковый ввод, представляющий название библиотеки
  2. Прочитать несколько пар входных данных, представляющих названия книг и годы их публикации (ввод закончится, когда вы получите "catalog_done")
  3. Создать Map для хранения названия каждой книги в качестве ключа и года ее публикации в качестве значения
  4. Использовать свойство .keys для извлечения всех названий книг и преобразовать их в List
  5. Использовать свойство .values для извлечения всех годов публикации и преобразовать их в List
  6. Найти самую старую книгу, определив минимальный год из значений
  7. Найти самую новую книгу, определив максимальный год из значений
  8. Вывести анализ библиотеки в точном формате, показанном ниже

Например, если название библиотеки — "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:");
  // Добавьте ваши операторы вывода здесь
}
quiz iconПроверьте себя

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

Все уроки раздела Логика и управление потоком