Menu
Coddy logo textTech

Проверка наличия элементов в множестве

Часть раздела Логика и управление потоком путешествия по Dart на Coddy — урок 20 из 65.

При работе с Set вам часто потребуется проверять, существует ли определенный элемент в коллекции. Метод contains() предоставляет простой и эффективный способ выполнения этой проверки, возвращая true, если элемент найден, и false, если нет.

Одним из ключевых преимуществ использования contains() с Set является его исключительная производительность. В отличие от поиска в 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

Этот метод особенно полезен, когда вам нужно валидировать данные, проверять предварительные условия или фильтровать информацию на основе принадлежности к определенной коллекции. Логический результат (boolean) делает его идеальным для использования в условных операторах и логических операциях.

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Проверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком