Map 순회하기
Coddy Dart 여정의 로직 & 흐름 섹션에 포함된 레슨 — 65개 중 26번째.
Map 컬렉션을 작업할 때, 모든 키-값 쌍을 처리해야 하는 경우가 많습니다. forEach 메서드는 맵의 모든 항목을 순회하는 깔끔한 방법을 제공하며, 키와 그에 대응하는 값 모두에 접근할 수 있게 해줍니다.
forEach 메서드는 함수를 인자로 받습니다. 이 함수는 맵의 각 항목에 대해 키(key)와 값(value)이라는 두 개의 매개변수를 받습니다. 이 메서드는 맵에 있는 모든 키-값 쌍에 대해 자동으로 함수를 한 번씩 호출합니다.
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"을 받으면 종료됩니다). - 각 메뉴 항목을 키(key)로, 판매 금액을 값(value)으로 저장하는 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 pointsforEach 메서드는 맵의 모든 키-값 쌍에 대해 함수를 자동으로 한 번씩 호출하므로, 수동 반복 로직 없이 모든 항목을 편리하게 처리할 수 있습니다.
직접 해보기
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리스트 정렬리스트 섞기요약 - 리스트 정리 도구