'firstWhere' による検索
CoddyのDartジャーニー「論理とフロー」セクションの一部 — レッスン 15/65。
リストの中から特定の条件を満たす特定の要素を見つける必要がある場合、firstWhere() メソッドは効率的な解決策を提供します。一致するすべての要素を返すフィルタリングメソッドとは異なり、firstWhere() は、条件を満たす最初の要素が見つかるとすぐに検索を停止します。
firstWhere() メソッドは、各要素に対して true または false を返すテスト関数を受け取ります。テストに合格する最初の要素が見つかるまで要素を1つずつ調べ、見つかったらすぐにその要素を返します。
List<int> numbers = [1, 3, 8, 15, 22, 7];
// 最初の偶数を見つける
int firstEven = numbers.firstWhere((number) => number % 2 == 0);
print(firstEven); // 8条件に一致する要素がない場合のために、firstWhere() はオプションの orElse パラメータを提供しています。このパラメータは、一致するものが見つからないときにデフォルト値を返す関数を受け取り、プログラムがエラーでクラッシュするのを防ぎます。
チャレンジ
簡単即座に対応が必要な最初の顧客の苦情を見つけることで、カスタマーサービスシステムを管理するプログラムを作成してください。プログラムは以下の手順で行う必要があります:
- 部署名を表す文字列の入力を読み込む
- 苦情の優先度レベルを表す複数の整数の入力を読み込む(入力は
-1を受け取った時点で終了します) - 緊急優先度のしきい値を表す整数の入力を読み込む
firstWhere()メソッドを使用して、優先度レベルが緊急しきい値以上の最初の苦情を見つける- 以下の形式でカスタマーサービスの結果を出力する
例えば、部署名が "Technical Support"、優先度レベルが 3, 7, 2, 9, 4、緊急しきい値が 8 の場合、プログラムは以下のように出力する必要があります:
Department: Technical Support
All complaints: [3, 7, 2, 9, 4]
Urgent threshold: 8
Searching for first complaint >= 8
First urgent complaint: 9
Status: Urgent complaint found - immediate action requiredもし部署名が "Billing Department"、優先度レベルが 4, 6, 3, 5、緊急しきい値が 7 の場合、プログラムは以下のように出力する必要があります:
Department: Billing Department
All complaints: [4, 6, 3, 5]
Urgent threshold: 7
Searching for first complaint >= 7
First urgent complaint: Not found
Status: No urgent complaints - continue normal processingもし部署名が "Sales Support"、優先度レベルが 10, 2, 8、緊急しきい値が 9 の場合、プログラムは以下のように出力する必要があります:
Department: Sales Support
All complaints: [10, 2, 8]
Urgent threshold: 9
Searching for first complaint >= 9
First urgent complaint: 10
Status: Urgent complaint found - immediate action requiredプログラムでは、緊急しきい値以上の最初の苦情の優先度を見つけるために firstWhere() メソッドを使用する必要があります。緊急の苦情が見つからない場合は、最初の緊急の苦情として "Not found" を表示し、ステータスとして "No urgent complaints - continue normal processing" を表示してください。緊急の苦情が見つかった場合は、その優先度レベルを表示し、ステータスとして "Urgent complaint found - immediate action required" を表示してください。
チートシート
firstWhere() メソッドは、特定の条件を満たすリスト内の最初の要素を見つけます。一致するものが見つかるとすぐに検索を停止し、その要素を返します。
List<int> numbers = [1, 3, 8, 15, 22, 7];
// 最初の偶数を見つける
int firstEven = numbers.firstWhere((number) => number % 2 == 0);
print(firstEven); // 8条件に一致する要素がない場合にデフォルト値を提供するには、orElse パラメータを使用します:
// 一致するものが見つからない場合にデフォルト値を返す
int result = numbers.firstWhere(
(number) => number > 100,
orElse: () => -1
);自分で試してみよう
import 'dart:io';
void main() {
// 部署名を読み込む
String? department = stdin.readLineSync();
// -1が入力されるまで苦情の優先度レベルを読み込む
List<int> complaints = [];
while (true) {
int priority = int.parse(stdin.readLineSync()!);
if (priority == -1) break;
complaints.add(priority);
}
// 緊急のしきい値を読み込む
int urgentThreshold = int.parse(stdin.readLineSync()!);
// TODO: 以下にコードを記述してください
// firstWhere()メソッドを使用して、urgentThreshold以上の最初の苦情を見つける
// 結果を出力する
print('Department: $department');
print('All complaints: $complaints');
print('Urgent threshold: $urgentThreshold');
print('Searching for first complaint >= $urgentThreshold');
// 最初の緊急の苦情の結果を出力する
// ステータスメッセージを出力する
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
1リスト操作の応用
リストのプロパティ: first と lastリストの状態: isEmpty と isNotEmptyリストの反転リストへの追加: insertリストの削除: removeWhereリスト内の検索: indexOfリストのソートリストのシャッフルまとめ - リストオーガナイザー2関数型リスト操作
'map' による変換'where' によるフィルタリング'.toList()' の使用'any' による条件チェック'every' による条件判定'firstWhere' による検索まとめ:データフィルタリング