Menu
Coddy logo textTech

セット内の要素の確認

CoddyのDartジャーニー「論理とフロー」セクションの一部 — レッスン 20/65。

Set を使用する場合、特定の要素がコレクション内に存在するかどうかを確認する必要が頻繁にあります。contains() メソッドは、この確認を行うためのシンプルで効率的な方法を提供し、要素が見つかった場合は true を、見つからない場合は false を返します。

Setcontains() を使用する主な利点の1つは、その優れたパフォーマンスです。各要素を1つずつチェックする必要がある可能性がある List 内の検索とは異なり、 Set の操作は高速なルックアップに最適化されているため、大規模なコレクションであっても contains() は非常に効率的です。

Set<String> ingredients = {'flour', 'sugar', 'eggs', 'butter'};

// 特定の材料が含まれているか確認します
bool hasFlour = ingredients.contains('flour');
bool hasMilk = ingredients.contains('milk');

print(hasFlour);  // true
print(hasMilk);   // false

このメソッドは、データの検証、前提条件のチェック、または特定のコレクションへの所属に基づいた情報のフィルタリングが必要な場合に特に有用です。ブール値の結果を返すため、条件文や論理演算での使用に最適です。

challenge icon

チャレンジ

簡単

キッチンのパントリーに特定の材料があるかどうかを確認し、レシピの検証を行うプログラムを作成してください。プログラムの要件は以下の通りです:

  1. レシピ名を表す文字列の入力を読み込む
  2. パントリーにある利用可能な材料を表す複数の文字列入力を読み込む(入力は "pantry_done" を受け取った時点で終了します)
  3. レシピに必要な材料を表す複数の文字列入力を読み込む(入力は "recipe_done" を受け取った時点で終了します)
  4. 利用可能なパントリーの材料を含む Set を作成する
  5. contains() メソッドを使用して、必要な各材料がパントリーにあるかどうかを確認する
  6. レシピの検証結果を、以下に示す正確な形式で出力する

例えば、レシピ名が "Chocolate Chip Cookies" で、パントリーの材料が "flour", "sugar", "eggs", "butter", "vanilla" であり、必要な材料が "flour", "sugar", "chocolate chips", "butter" の場合、プログラムは以下のように出力する必要があります:

Recipe: Chocolate Chip Cookies
Pantry ingredients: {flour, sugar, eggs, butter, vanilla}
Required ingredients: [flour, sugar, chocolate chips, butter]
Checking ingredient availability:
- flour: Available
- sugar: Available
- chocolate chips: Missing
- butter: Available
Missing ingredients: [chocolate chips]
Status: Cannot make recipe - missing 1 ingredient(s)

レシピ名が "Scrambled Eggs" で、パントリーの材料が "eggs", "butter", "salt", "pepper" であり、必要な材料が "eggs", "butter", "salt" の場合、プログラムは以下のように出力する必要があります:

Recipe: Scrambled Eggs
Pantry ingredients: {eggs, butter, salt, pepper}
Required ingredients: [eggs, butter, salt]
Checking ingredient availability:
- eggs: Available
- butter: Available
- salt: Available
Missing ingredients: []
Status: Ready to cook - all ingredients available

レシピ名が "Fruit Salad" で、パントリーの材料が "apples", "bananas" であり、必要な材料が "apples", "oranges", "grapes", "honey" の場合、プログラムは以下のように出力する必要があります:

Recipe: Fruit Salad
Pantry ingredients: {apples, bananas}
Required ingredients: [apples, oranges, grapes, honey]
Checking ingredient availability:
- apples: Available
- oranges: Missing
- grapes: Missing
- honey: Missing
Missing ingredients: [oranges, grapes, honey]
Status: Cannot make recipe - missing 3 ingredient(s)

プログラムでは、contains() メソッドを使用して、必要な各材料をパントリーの Set と照合する必要があります。必要な材料はリストに保存してチェックの順序を維持し、不足している材料は別のリストに収集してください。すべての材料が揃っている場合は、ステータスとして "Ready to cook - all ingredients available" を表示します。不足している材料がある場合は、"Cannot make recipe - missing X ingredient(s)" (X は不足している材料の数)を表示してください。

チートシート

contains() メソッドを使用して、特定の要素が Set 内に存在するかどうかを確認します。要素が見つかった場合は true を、見つからない場合は false を返します。

Set<String> ingredients = {'flour', 'sugar', 'eggs', 'butter'};

bool hasFlour = ingredients.contains('flour');
bool hasMilk = ingredients.contains('milk');

print(hasFlour);  // true
print(hasMilk);   // false

contains() メソッドは Set コレクションにおいて非常に効率的であり、大規模なデータセットであっても高速なルックアップに最適です。バリデーション、前提条件の確認、および条件付き操作に特に役立ちます。

自分で試してみよう

import 'dart:io';

void main() {
  // レシピ名を読み込む
  String? recipeName = stdin.readLineSync();
  
  // "pantry_done" が入力されるまでパントリーの材料を読み込む
  Set<String> pantryIngredients = <String>{};
  String? pantryInput;
  while ((pantryInput = stdin.readLineSync()) != "pantry_done") {
    if (pantryInput != null) {
      pantryIngredients.add(pantryInput);
    }
  }
  
  // "recipe_done" が入力されるまで必要な材料を読み込む
  List<String> requiredIngredients = <String>[];
  String? recipeInput;
  while ((recipeInput = stdin.readLineSync()) != "recipe_done") {
    if (recipeInput != null) {
      requiredIngredients.add(recipeInput);
    }
  }
  
  // TODO: 以下にコードを記述してください
  // pantryIngredients.contains() を使用して、各必要な材料を確認します
  // 不足している材料を保存するためのリストを作成します
  // 在庫状況を確認し、指定された形式で結果を出力します
  
  // 結果を出力します(独自の実装に置き換えてください)
  print("Recipe: $recipeName");
  print("Pantry ingredients: $pantryIngredients");
  print("Required ingredients: $requiredIngredients");
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理とフローのすべてのレッスン