遍历映射
本课属于 Coddy Dart 学习旅程的“逻辑与流程控制”单元。第 26 课,共 65 课。
处理 Map 集合时,你通常需要处理每个键值对。forEach 方法可以让你简洁地遍历映射中的所有条目,并访问每个条目对应的键和值。
forEach 方法接收一个函数作为参数。这个函数会接收两个参数:映射中每个条目的键和值。该方法会自动为映射中的每个键值对调用一次你的函数。
Map<String, int> studentScores = {
'Alice': 85,
'Bob': 92,
'Charlie': 78
};
studentScores.forEach((name, score) {
print('$name scored $score points');
});
// 输出:
// Alice 得了 85 分
// Bob 得了 92 分
// Charlie 得了 78 分与手动访问每个键或尝试用其他方法遍历映射相比,这种方式方便得多。forEach 方法会为你处理所有迭代逻辑,让你在需要处理映射中的每个条目时,代码更加简洁易读。
挑战
简单创建一个程序,通过分析菜单项及其销售数据来管理餐厅的每日销售报告系统。你的程序应当:
- 读取一个表示餐厅名称的字符串输入
- 读取多组输入,每组表示一个菜单项及其销售额(收到
"sales_done"时,输入结束) - 创建一个 Map,将每个菜单项作为键,将其销售额作为值
- 使用
forEach方法遍历销售数据并计算总收入 - 再次使用
forEach方法,找出最畅销的菜单项(销售额最高的菜单项) - 按照下方所示的准确格式打印销售报告
例如,如果餐厅名称是 "Mario's Pizza",销售数据中包含销售额为 450 的 "Margherita Pizza"、销售额为 280 的 "Caesar Salad"、销售额为 320 的 "Garlic Bread",以及销售额为 180 的 "Tiramisu",你的程序应输出:
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",销售数据中包含销售额为 380 的 "California Roll"、销售额为 520 的 "Salmon Sashimi",以及销售额为 150 的 "Miso Soup",你的程序应输出:
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",销售数据中包含销售额为 600 的 "Classic Burger"、销售额为 400 的 "French Fries"、销售额为 250 的 "Milkshake",以及销售额为 180 的 "Onion Rings",你的程序应输出:
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" 结束。
亲手试试
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:");
// 显示每个菜品并计算总收入
// 找出并显示最畅销的菜品
// 显示总收入和状态
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程控制中的所有课
自己练习: Dart 在线编译器