Перейти к содержанию

🗒 Задача

Представь, что ты работаешь над приложением с рецептами (кстати, это приложение мы вместе будем разрабатывать на практике AndroidSprint). Напиши код, который проверяет, есть ли нужный ингредиент в рецепте.

  • создай массив, в котором будет храниться список ингредиентов для определенного блюда;

  • далее через консоль запроси у пользователя информацию об ингредиенте, который он хочет найти;

  • произведи поиск элемента по массиву, используя цикл for;

  • если ингредиент в списке есть, выведи в консоль сообщение - “Ингредиент [название] в рецепте есть”;

  • если нет, сообщать: “Такого ингредиента в рецепте нет”.

❌ Ошибки

  • создают не массив (arrayOf), а динамический список (arrayListOf)

  • обращаются к индексам для поиска ингредиента

  • после нахождения не выходят из цикла (или не завершают программу)

✏️ Комментарии

Можно обойтись без обращения к индексам. А проходить по массиву просто через `in` и в `i` будет передаваться каждый элемент для сравнения.
После нахождения определенного элемента предлагаю еще останавливать цикл
Можно еще короче - печатать, что элемент найден и останавливать программу. А если цикл ничего не нашел, после цикла печатать, что ничего не найдено
`indexOf` под капотом осуществляет точно такой же перебор элементов массива (чтобы убедиться, попробуй вызвать у метода `indexOf` контекстное меню и выбрать `Go To` -> `Implementation`).
Получается само по себе решение не имеет смысла - оно не эффективно с точки зрения алгоритмов.
В случаях перебора массивов обычно использую какой-то признак того, что элемент не был найден, например boolean переменную isFound. И уже за пределами цикла печатают в зависимости от значений флага
Оператор in неявно проходится по массиву, но я прошу пройтись по всем элементам, чтобы дальше перейти уже к решению без цикла )
Старый коммент по стилистике - циклы рекомендуется обосабливать пустыми строками разделителями. Иначе код выглядит довольно монолитным и плохо читается
Текущая реализация выводит сообщение "Такого ингредиента в рецепте нет" даже если ингредиент был найден. Вывод сообщения о том, что ингредиент не найден, должен происходить после цикла и только если проверка всех элементов не показала наличие ингредиента.
Конструкция else { continue } излишня, так как она не влияет на логику программы — цикл и так перейдет к следующей итерации после каждой проверки. Что, если печатать, что элемент найден и останавливать программу. А если цикл ничего не нашел, после цикла печатать, что ничего не найдено
Сообщение, что рецепта нет лучше вынести за пределы цикла. Потому, что когда мы находим ингредиент

🧾 Решение

fun main() {

    val arrayIngredients = arrayOf("картофель", "майонез", "чеснок", "соль", "любовь")

    print("Введите название ингредиента: >> ")
    val userInput = readln()

    for (i in arrayIngredients) {
        if (i == userInput) {
            println("Ингредиент $i в рецепте есть")
            return
        }
    }

    println("Такого ингредиента в рецепте нет")

}