Mapの反復処理
CoddyのDartジャーニー「論理とフロー」セクションの一部 — レッスン 26/65。
Map コレクションを扱う際、すべてのキーと値のペアを処理する必要がよくあります。forEach メソッドは、マップ内のすべてのエントリを反復処理するための簡潔な方法を提供し、キーとその対応する値の両方にアクセスできるようにします。
forEachメソッドは、引数として関数を受け取ります。この関数は、マップ内の各エントリのキーと値という2つのパラメータを受け取ります。このメソッドは、マップ内のすべてのキーと値のペアに対して、自動的に関数を1回ずつ呼び出します。
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プログラムでは、Map のエントリを反復処理するために forEach メソッドを使用する必要があります。まず、forEach を使用して各メニュー項目とその売上金額を表示し、同時に総収益を計算します。次に、別の forEach を使用して、売上金額が最も高い項目を見つけます。入力形式は、レストラン名、次にメニュー項目名と売上金額(整数に変換する必要がある文字列として)が交互に続き、最後に "sales_done" で終わります。
チートシート
forEachメソッドを使用すると、Map内のすべてのキーと値のペアを反復処理できます。このメソッドは、各エントリのキーと値の2つのパラメータを受け取る関数を引数に取ります。
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メソッドは、マップ内のすべてのキーと値のペアに対して自動的に関数を1回ずつ呼び出すため、手動で反復処理のロジックを書くことなく、すべてのエントリを効率的に処理するのに便利です。
自分で試してみよう
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リストのソートリストのシャッフルまとめ - リストオーガナイザー