Итерация по 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 берет на себя всю логику итерации, делая ваш код чище и читабельнее, когда вам нужно обработать каждую запись в карте.
Задание
ЛегкоСоздайте программу, которая управляет системой ежедневной отчетности о продажах ресторана, анализируя пункты меню и данные об их продажах. Ваша программа должна:
- Прочитать строковый ввод, представляющий название ресторана
- Прочитать несколько пар входных данных, представляющих пункты меню и суммы их продаж (ввод закончится, когда вы получите
"sales_done") - Создать Map для хранения каждого пункта меню в качестве ключа и суммы его продаж в качестве значения
- Использовать метод
forEachдля итерации по данным о продажах и расчета общей выручки - Снова использовать метод
forEachдля определения самого продаваемого товара (наибольшая сумма продаж) - Вывести отчет о продажах в точном формате, показанном ниже
Например, если название ресторана — "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:");
// Отобразить каждый товар и рассчитать общую сумму
// Найти и отобразить самый продаваемый товар
// Отобразить общую выручку и статус
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
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Множества
Что такое множество?Создание множестваДобавление и удаление элементовПроверка наличия элементов в множествеПреобразование списка в множествоОбъединение множествПересечение множествРазность множествИтоги: уникальный список гостей