Duyệt qua Map
Thuộc phần Logic và luồng điều khiển trong hành trình Dart của Coddy. Bài học 26 trên 65.
Khi làm việc với các bộ sưu tập Map, bạn thường cần xử lý mọi cặp khóa-giá trị. Phương thức forEach giúp bạn duyệt qua tất cả các mục trong một map một cách rõ ràng, đồng thời truy cập được cả khóa và giá trị tương ứng.
Phương thức forEach nhận một hàm (function) làm đối số. Hàm này nhận hai tham số: khóa và giá trị của mỗi mục trong bản đồ. Phương thức tự động gọi hàm của bạn một lần cho mỗi cặp khóa và giá trị trong bản đồ.
Map<String, int> studentScores = {
'Alice': 85,
'Bob': 92,
'Charlie': 78
};
studentScores.forEach((name, score) {
print('$name scored $score points');
});
// Đầu ra:
// Alice đạt 85 điểm
// Bob đạt 92 điểm
// Charlie đạt 78 điểmCách này thuận tiện hơn nhiều so với việc truy cập thủ công từng khóa hoặc dùng các phương thức khác để lặp qua bản đồ. Phương thức forEach xử lý toàn bộ logic lặp cho bạn, giúp code gọn gàng và dễ đọc hơn khi bạn cần xử lý mọi mục trong bản đồ.
Thử thách
DễTạo một chương trình quản lý hệ thống báo cáo doanh thu hằng ngày của nhà hàng bằng cách phân tích các món trong thực đơn và dữ liệu doanh thu của chúng. Chương trình cần:
- Đọc đầu vào là một chuỗi (string) thể hiện tên nhà hàng
- Đọc nhiều cặp đầu vào thể hiện tên món ăn trong thực đơn và doanh thu của món đó (đầu vào sẽ kết thúc khi bạn nhận được
"sales_done") - Tạo một Map để lưu mỗi món ăn trong thực đơn làm khóa và doanh thu của món đó làm giá trị
- Dùng phương thức (method)
forEachđể duyệt qua dữ liệu doanh thu và tính tổng doanh thu - Dùng lại
forEachđể xác định món bán chạy nhất (có doanh thu cao nhất) - In báo cáo doanh thu theo đúng định dạng bên dưới
Ví dụ, nếu tên nhà hàng là "Mario's Pizza" và dữ liệu doanh thu gồm "Margherita Pizza" với 450, "Caesar Salad" với 280, "Garlic Bread" với 320, "Tiramisu" với 180, chương trình của bạn sẽ in ra:
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 successfullyNếu tên nhà hàng là "Sushi Express" và dữ liệu doanh thu gồm "California Roll" với 380, "Salmon Sashimi" với 520, "Miso Soup" với 150, chương trình của bạn sẽ in ra:
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 successfullyNếu tên nhà hàng là "Burger Palace" và dữ liệu doanh thu gồm "Classic Burger" với 600, "French Fries" với 400, "Milkshake" với 250, "Onion Rings" với 180, chương trình của bạn sẽ in ra:
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 successfullyChương trình của bạn phải dùng phương thức forEach để duyệt qua các mục trong Map. Trước tiên, dùng forEach để hiển thị từng món ăn trong thực đơn và doanh thu của món đó, đồng thời tính tổng doanh thu. Sau đó, dùng lại forEach để tìm món có doanh thu cao nhất. Định dạng đầu vào sẽ là: tên nhà hàng, sau đó là tên các món ăn trong thực đơn và doanh thu của chúng xen kẽ nhau (dưới dạng chuỗi cần chuyển đổi thành số nguyên), kết thúc bằng "sales_done".
Tự làm thử
import 'dart:io';
void main() {
// Đọc tên nhà hàng
String? restaurantName = stdin.readLineSync();
// Tạo Map để lưu các món trong thực đơn và doanh số của từng món
Map<String, int> salesData = {};
// Đọc các món trong thực đơn và doanh số cho đến khi gặp "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: Viết code bên dưới
// Dùng forEach để tính tổng doanh thu và hiển thị dữ liệu bán hàng
// Dùng forEach lần nữa để tìm món bán chạy nhất
// In báo cáo bán hàng theo định dạng yêu cầu
print("Restaurant: $restaurantName");
print("Daily Sales Report:");
// Hiển thị từng món và tính tổng
// Tìm và hiển thị món bán chạy nhất
// Hiển thị tổng doanh thu và trạng thái
}Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng điều khiển
1Thao tác nâng cao với danh sách
Thuộc tính danh sách: đầu và cuốiTrạng thái danh sách: isEmpty và isNotEmpĐảo ngược danh sáchThêm vào danh sách: insertXóa khỏi danh sách: removeWhereTìm trong danh sách: indexOfSắp xếp danh sáchXáo trộn danh sáchÔn tập: trình sắp xếp danh sách4Thao tác nâng cao với Map
Duyệt qua MapKiểm tra khóa và giá trịCác thuộc tính của Map: khóa và giá trịThêm có điều kiện: putIfAbsentXóa mục khỏi MapMap lồng nhauÔn tập: Cập nhật kho hàng2Thao tác hàm trên danh sách
Biến đổi bằng 'map'Lọc bằng 'where'Dùng '.toList()'Kiểm tra điều kiện bằng 'any'Điều kiện với 'every'Tìm phần tử bằng 'firstWhere'Ôn tập: lọc dữ liệu5Dự án: Tính tiền giỏ hàng
Thiết lập dự ánThêm mặt hàng vào giỏ8Dự án: Trình phân tích văn bản đơn giản
Tổng quan và thiết lập dự ánĐếm ký tự3Tập hợp
Tập hợp là gì?Tạo tập hợpThêm và xóa phần tử khỏi tập hợpKiểm tra phần tử trong tập hợpChuyển danh sách thành tập hợpPhép hợp của các tập hợpPhép giao của các tập hợpPhép hiệu của các tập hợpÔn tập: danh sách khách mời không trùng lặpTự luyện tập: Trình biên dịch Dart online