'map' による変換
CoddyのDartジャーニー「論理とフロー」セクションの一部 — レッスン 10/65。
リスト内のすべての要素を新しいものに変換する必要がある場合、Dartは強力な map() メソッドを提供しています。このメソッドは、リストの各要素に変換関数を適用し、変換されたすべての結果を含む新しいリストを作成します。
map() メソッドは、各要素をどのように変換するかを定義する関数を引数として受け取ります。この関数は、元のリストから各要素を受け取り、変換された値を返します。その後、map() メソッドは、これらすべての変換された値を新しいリストにまとめます。
List<int> numbers = [1, 2, 3, 4, 5];
// 各数値を2倍にして変換します
var doubled = numbers.map((number) => number * 2);
print(doubled); // (2, 4, 6, 8, 10)このアプローチは、手動で新しいリストを作成し、ループを使用して各要素を変換するよりもはるかにエレガントです。map() メソッドは関数型プログラミングにおける基本的な概念を表しており、データの変換を明確かつ簡潔な方法で表現することを可能にします。
チャレンジ
簡単店舗の在庫にあるすべての商品に対して、パーセンテージに基づいた価格調整を適用する、製品価格管理システムを作成してください。プログラムは以下の手順で行う必要があります:
- 店舗名を表す文字列の入力を読み込む
- 元の製品価格を表す複数の小数の入力を読み込む(入力は
-1を受け取った時点で終了します) - 価格調整のパーセンテージを表す小数の入力を読み込む(正の値は値上げ、負の値は割引を意味します)
map()メソッドを使用して、各価格にパーセンテージ調整を適用して変換する- 価格調整の結果を、以下に示す正確な形式で出力する
例えば、店舗名が "Tech Store"、価格が 99.99、149.50、79.99、199.99 で、調整が 15.0(15%の値上げ)の場合、プログラムは以下のように出力する必要があります:
Store: Tech Store
Original prices: [99.99, 149.5, 79.99, 199.99]
Applying 15.0% adjustment
Adjusted prices: (114.9885, 171.925, 91.9885, 229.9885)
Total items processed: 4
Status: Price adjustment completed店舗名が "Fashion Outlet"、価格が 29.99、45.00 で、調整が -20.0(20%の割引)の場合、プログラムは以下のように出力する必要があります:
Store: Fashion Outlet
Original prices: [29.99, 45.0]
Applying -20.0% adjustment
Adjusted prices: (23.992, 36.0)
Total items processed: 2
Status: Price adjustment completed店舗名が "Book Corner" で、価格が 12.50 一つのみ提供され、調整が 0.0 の場合、プログラムは以下のように出力する必要があります:
Store: Book Corner
Original prices: [12.5]
Applying 0.0% adjustment
Adjusted prices: (12.5)
Total items processed: 1
Status: Price adjustment completedプログラムでは、map() メソッドを使用し、次の式を用いて新しい価格を計算する変換関数を適用する必要があります:originalPrice * (1 + percentage / 100)。map() メソッドは、調整後のすべての価格を含むイテラブル(iterable)を返す必要があり、それは括弧形式で表示されます。
チートシート
map() メソッドは、リスト内のすべての要素に関数を適用し、その結果を含む新しいリストを作成することで、各要素を変換します。
map() メソッドは、変換を定義する関数を引数として受け取ります。この関数は各要素を受け取り、変換されたバージョンを返します:
List<int> numbers = [1, 2, 3, 4, 5];
// 各数値を2倍にして変換します
var doubled = numbers.map((number) => number * 2);
print(doubled); // (2, 4, 6, 8, 10)これは、手動で新しいリストを作成し、変換のためにループを使用するよりもエレガントです。
自分で試してみよう
import 'dart:io';
void main() {
// 店舗名を読み込む
String? storeName = stdin.readLineSync();
// -1が入力されるまで価格を読み込む
List<double> prices = [];
while (true) {
String? input = stdin.readLineSync();
double price = double.parse(input!);
if (price == -1) {
break;
}
prices.add(price);
}
// 調整率(パーセンテージ)を読み込む
String? adjustmentInput = stdin.readLineSync();
double adjustment = double.parse(adjustmentInput!);
// TODO: 以下にコードを記述してください
// map()メソッドを使用して、すべての価格に調整率を適用します
// 計算式: 元の価格 * (1 + パーセンテージ / 100)
// 結果を出力する
print('Store: $storeName');
print('Original prices: $prices');
print('Applying $adjustment% adjustment');
// 調整後の価格を括弧形式で出力する
// 処理されたアイテムの総数を出力する
// ステータスメッセージを出力する
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
1リスト操作の応用
リストのプロパティ: first と lastリストの状態: isEmpty と isNotEmptyリストの反転リストへの追加: insertリストの削除: removeWhereリスト内の検索: indexOfリストのソートリストのシャッフルまとめ - リストオーガナイザー