リストの削除: removeWhere
CoddyのDartジャーニー「論理とフロー」セクションの一部 — レッスン 5/65。
特定の条件に基づいて、リストから複数の要素を削除する必要がある場合があります。要素を1つずつ削除する代わりに、Dartは1回の操作でテスト条件に一致するすべての要素を削除できるremoveWhere()メソッドを提供しています。
removeWhere()メソッドは、テスト関数を引数として受け取ります。この関数はリストの各要素を受け取り、その要素を削除すべき場合はtrueを、残すべき場合はfalseを返します。その後、このメソッドはテスト関数がtrueを返すすべての要素を削除します。
List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8];
// すべての偶数を取り除く
numbers.removeWhere((number) => number % 2 == 0);
print(numbers); // [1, 3, 5, 7]この手法は、要素を一つずつ手動で探して削除するよりもはるかに効率的です。removeWhere() メソッドは元のリストを直接変更するため、真偽値(boolean)のテストとして表現できるあらゆる条件に基づいてリストを整理するための強力なツールとなります。
チャレンジ
簡単クラスの名簿から不合格となった生徒を削除することで、生徒の成績フィルタリングシステムを管理するプログラムを作成してください。プログラムは以下の手順で行う必要があります:
- クラス名を表す文字列の入力を読み込む
- 生徒のスコアを表す複数の整数の入力を読み込む(入力は
-1を受け取った時点で終了します) removeWhere()メソッドを使用して、60点未満のすべてのスコア(不合格点)を削除する- 成績フィルタリングの結果を、以下に示す正確な形式で出力する
例えば、クラス名が "Mathematics 101" で、スコアが 85, 45, 92, 38, 76, 55, 88 の場合、プログラムは次のように出力する必要があります:
Class: Mathematics 101
Original scores: [85, 45, 92, 38, 76, 55, 88]
Removed failing scores (below 60)
Passing scores: [85, 92, 76, 88]
Students passed: 4
Students failed: 3クラス名が "History 201" で、すべてのスコアが合格点(75, 82, 91)の場合、プログラムは次のように出力する必要があります:
Class: History 201
Original scores: [75, 82, 91]
Removed failing scores (below 60)
Passing scores: [75, 82, 91]
Students passed: 3
Students failed: 0クラス名が "Chemistry 301" で、すべてのスコアが不合格点(45, 32, 58)の場合、プログラムは次のように出力する必要があります:
Class: Chemistry 301
Original scores: [45, 32, 58]
Removed failing scores (below 60)
Passing scores: []
Students passed: 0
Students failed: 3プログラムでは、60点未満のスコアに対して true を返すテスト関数を指定した removeWhere() メソッドを使用する必要があります。このメソッドは、元のリストを変更してすべての不合格点を削除し、合格点のみを残すようにしてください。
チートシート
removeWhere() メソッドは、特定の条件に一致するすべての要素をリストから削除します。このメソッドは、削除する要素に対して true を返し、保持する要素に対して false を返すテスト関数を引数に取ります。
List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8];
// すべての偶数を削除します
numbers.removeWhere((number) => number % 2 == 0);
print(numbers); // [1, 3, 5, 7]このメソッドは元のリストを直接変更し、要素を個別に削除するよりも効率的です。
自分で試してみよう
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);
}
// 表示用に元のスコアを保存する
List<int> originalScores = List.from(scores);
// TODO: 以下にコードを記述してください
// removeWhere()メソッドを使用して60点未満のスコアを削除する
// 結果を出力する
print('Class: $className');
print('Original scores: $originalScores');
print('Removed failing scores (below 60)');
print('Passing scores: $scores');
print('Students passed: ${scores.length}');
print('Students failed: ${originalScores.length - scores.length}');
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
1リスト操作の応用
リストのプロパティ: first と lastリストの状態: isEmpty と isNotEmptyリストの反転リストへの追加: insertリストの削除: removeWhereリスト内の検索: indexOfリストのソートリストのシャッフルまとめ - リストオーガナイザー