'where' によるフィルタリング
CoddyのDartジャーニー「論理とフロー」セクションの一部 — レッスン 11/65。
map() はリストのすべての要素を変換しますが、特定の条件を満たす要素だけを保持したい場合があります。where() メソッドを使用すると、各要素に対して条件をテストし、そのテストに合格した要素のみを保持することで、リストをフィルタリングできます。
where() メソッドは、各要素に対して true または false を返すテスト関数を受け取ります。true を返す要素は結果に含まれ、false を返す要素は除外されます。
List<int> scores = [45, 78, 92, 33, 67, 88];
// 50より大きいスコアのみを保持するようにフィルタリングする
var passingScores = scores.where((score) => score > 50);
print(passingScores); // (78, 92, 67, 88)このフィルタリング手法は、リストを手動でループして新しいコレクションを構築するよりも、はるかにクリーンです。where()メソッドはデータ処理における基本的なパターンを表しており、どのように抽出するかではなく、何を保持したいかを宣言的に指定することができます。
チャレンジ
簡単テストのスコアに基づいて学生をフィルタリングし、学生の成績追跡システムを管理するプログラムを作成してください。プログラムは以下の手順で行う必要があります:
- クラス名を表す文字列の入力を読み込む
- 学生のテストスコアを表す複数の整数の入力を読み込む(入力は
-1を受け取った時点で終了します) - 合格最低点のしきい値を表す整数の入力を読み込む
where()メソッドを使用して、しきい値以上のスコアのみをフィルタリングして保持する- フィルタリング結果を以下の形式で正確に出力する
例えば、クラス名が "Mathematics 101"、スコアが 85, 42, 78, 91, 55, 88 で、しきい値が 70 の場合、プログラムは以下のように出力する必要があります:
Class: Mathematics 101
Original scores: [85, 42, 78, 91, 55, 88]
Minimum passing score: 70
Filtering scores >= 70
Passing scores: (85, 78, 91, 88)
Students passed: 4 out of 6
Pass rate: 66.67%クラス名が "Science Lab"、スコアが 45, 38, 52 で、しきい値が 60 の場合、プログラムは以下のように出力する必要があります:
Class: Science Lab
Original scores: [45, 38, 52]
Minimum passing score: 60
Filtering scores >= 60
Passing scores: ()
Students passed: 0 out of 3
Pass rate: 0.00%クラス名が "History"、スコアが 95, 88, 92 で、しきい値が 80 の場合、プログラムは以下のように出力する必要があります:
Class: History
Original scores: [95, 88, 92]
Minimum passing score: 80
Filtering scores >= 80
Passing scores: (95, 88, 92)
Students passed: 3 out of 3
Pass rate: 100.00%プログラムでは、しきい値以上のスコアをフィルタリングするために where() メソッドを使用する必要があります。フィルタリングされた結果は、イテラブルとして括弧形式で表示されます。合格率は、次の式を使用して小数点以下2桁までのパーセンテージとして計算してください:(passing students / total students) * 100。
自分で試してみよう
import 'dart:io';
void main() {
// クラス名を読み込む
String? className = stdin.readLineSync();
// -1が入力されるまでスコアを読み込む
List<int> scores = [];
while (true) {
int score = int.parse(stdin.readLineSync()!);
if (score == -1) break;
scores.add(score);
}
// 最低合格点のしきい値を読み込む
int threshold = int.parse(stdin.readLineSync()!);
// TODO: 以下にコードを記述してください
// where()メソッドを使用して、しきい値以上のスコアをフィルタリングします
// 必要な形式で結果を出力します
print('Class: $className');
print('Original scores: $scores');
print('Minimum passing score: $threshold');
print('Filtering scores >= $threshold');
// 合格点、合格者数、および合格率を出力します
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
1リスト操作の応用
リストのプロパティ: first と lastリストの状態: isEmpty と isNotEmptyリストの反転リストへの追加: insertリストの削除: removeWhereリスト内の検索: indexOfリストのソートリストのシャッフルまとめ - リストオーガナイザー2関数型リスト操作
'map' による変換'where' によるフィルタリング'.toList()' の使用'any' による条件チェック'every' による条件判定'firstWhere' による検索まとめ:データフィルタリング