Menu
Coddy logo textTech

Итерация по Map

Часть раздела Логика и управление потоком путешествия по Dart на Coddy — урок 26 из 65.

При работе с коллекциями Map вам часто требуется обработать каждую пару ключ-значение. Метод forEach предоставляет удобный способ перебора всех записей в коллекции map, предоставляя доступ как к ключу, так и к его соответствующему значению.

Метод forEach принимает функцию в качестве аргумента. Эта функция получает два параметра: ключ и значение для каждой записи в коллекции map. Метод автоматически вызывает вашу функцию один раз для каждой пары ключ-значение в коллекции map.

Map<String, int> studentScores = {
  'Alice': 85,
  'Bob': 92,
  'Charlie': 78
};

studentScores.forEach((name, score) {
  print('$name scored $score points');
});
// Вывод:
// Alice scored 85 points
// Bob scored 92 points
// Charlie scored 78 points

Этот подход гораздо удобнее, чем ручной доступ к каждому ключу или попытка перебора карты с использованием других методов. Метод forEach берет на себя всю логику итерации, делая ваш код чище и читабельнее, когда вам нужно обработать каждую запись в карте.

challenge icon

Задание

Легко

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

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

Например, если название ресторана — "Mario's Pizza", а данные о продажах включают "Margherita Pizza" с 450, "Caesar Salad" с 280, "Garlic Bread" с 320, "Tiramisu" с 180, ваша программа должна вывести:

Restaurant: Mario's Pizza
Daily Sales Report:
Margherita Pizza: $450
Caesar Salad: $280
Garlic Bread: $320
Tiramisu: $180
Total Revenue: $1230
Best Selling Item: Margherita Pizza ($450)
Status: Sales report generated successfully

Если название ресторана — "Sushi Express", а данные о продажах включают "California Roll" с 380, "Salmon Sashimi" с 520, "Miso Soup" с 150, ваша программа должна вывести:

Restaurant: Sushi Express
Daily Sales Report:
California Roll: $380
Salmon Sashimi: $520
Miso Soup: $150
Total Revenue: $1050
Best Selling Item: Salmon Sashimi ($520)
Status: Sales report generated successfully

Если название ресторана — "Burger Palace", а данные о продажах включают "Classic Burger" с 600, "French Fries" с 400, "Milkshake" с 250, "Onion Rings" с 180, ваша программа должна вывести:

Restaurant: Burger Palace
Daily Sales Report:
Classic Burger: $600
French Fries: $400
Milkshake: $250
Onion Rings: $180
Total Revenue: $1430
Best Selling Item: Classic Burger ($600)
Status: Sales report generated successfully

Ваша программа должна использовать метод forEach для итерации по записям Map. Сначала используйте forEach для отображения каждого пункта меню и суммы его продаж, одновременно рассчитывая общую выручку. Затем снова используйте forEach, чтобы найти товар с наибольшей суммой продаж. Формат ввода будет следующим: название ресторана, затем чередующиеся названия пунктов меню и суммы продаж (в виде строк, которые необходимо преобразовать в целые числа), заканчивающиеся на "sales_done".

Шпаргалка

Метод forEach позволяет перебирать все пары «ключ-значение» в объекте Map. Он принимает функцию, которая получает два параметра: ключ и значение для каждой записи.

Map<String, int> studentScores = {
  'Alice': 85,
  'Bob': 92,
  'Charlie': 78
};

studentScores.forEach((name, score) {
  print('$name scored $score points');
});
// Вывод:
// Alice scored 85 points
// Bob scored 92 points
// Charlie scored 78 points

Метод forEach автоматически вызывает вашу функцию один раз для каждой пары «ключ-значение» в карте, что делает его удобным для обработки всех записей без логики ручного перебора.

Попробуйте сами

import 'dart:io';

void main() {
  // Считать название ресторана
  String? restaurantName = stdin.readLineSync();
  
  // Создать Map для хранения позиций меню и объемов их продаж
  Map<String, int> salesData = {};
  
  // Считывать позиции меню и объемы продаж до тех пор, пока не встретится "sales_done"
  while (true) {
    String? input = stdin.readLineSync();
    if (input == "sales_done") {
      break;
    }
    String menuItem = input!;
    String? salesAmountStr = stdin.readLineSync();
    int salesAmount = int.parse(salesAmountStr!);
    salesData[menuItem] = salesAmount;
  }
  
  // TODO: Напишите свой код ниже
  // Используйте forEach для расчета общей выручки и отображения данных о продажах
  // Снова используйте forEach, чтобы найти самый продаваемый товар
  
  // Вывести отчет о продажах в требуемом формате
  print("Restaurant: $restaurantName");
  print("Daily Sales Report:");
  // Отобразить каждый товар и рассчитать общую сумму
  // Найти и отобразить самый продаваемый товар
  // Отобразить общую выручку и статус
}
quiz iconПроверьте себя

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

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