Шаг 120.
Основы Kotlin.
Списки и множества. Множества. Цикл while

    На этом шаге мы рассмотрим особенности использования этого цикла при работе со множествами.

    Теперь, когда у вас есть список уникальных имен, пусть они сделают случайные заказы из меню. Однако в этом разделе вы должны использовать другой механизм для обхода коллекции: цикл while.

    Цикл for удобно использовать, когда нужно выполнить код для каждого элемента последовательности. Но он плохо подходит для случаев, когда цикл завершается по достижении некоторого состояния, а не после определенного числа итераций. Для таких ситуаций лучше подходит цикл while.

    Логика цикла while следующая: "Пока условие истинно, выполнять код в блоке". Сгенерируйте ровно 10 заказов, используя var как счетчик заказов, и цикл while, продолжающий выполняться, пока не будет сгенерировано 10 заказов.

    Добавьте в код Tavern.kt итерации по содержимому множества, чтобы получить в итоге 10 заказов. Для этого используйте цикл while.

.   .   .   .
fun main() {
    .    .   .   .
    (0..9).forEach {
        val first = patronList.shuffled().first()
        val last = lastName.shuffled().first()
        val name = "$first $last"
        uniquePatrons += name
    }
    println(uniquePatrons)

    var orderCount = 0
    while (orderCount <= 9) {
        placeOrder(uniquePatrons.shuffled().first(),
                menuList.shuffled().first())
        orderCount++
    }
}
.   .   .   .
Файл с проектом можно взять здесь.


Рис.1. Уникальные посетители совершают случайные заказы (Tavern.kt)

    Оператор инкремента (++) прибавляет 1 к значению orderCount в каждой итерации.

    Запустите Tavern.kt. В этот раз вы увидите 10 случайных заказов посетителей:

  Eli Ironfoot speaks with Taernyl about their order.
  Eli Ironfoot buys a pickled camel hump (desert dessert) for 7.33.
  Eli Ironfoot says: Thanks for the pickled camel hump.
  Sophie Fernsworth speaks with Taernyl about their order.
  Sophie Fernsworth buys a shirley temple (elixir) for 4.12.
  Sophie Fernsworth says: Thanks for the shirley temple.
  Eli Baggins speaks with Taernyl about their order.
  .   .   .   .


Рис.2. Результат работы приложения

    Цикл while требует вести счет заказов для определения условия продолжения. Вы начинаете со значения orderCount, равного 0, и увеличиваете его в каждой итерации. Цикл while более гибкий, чем цикл for, потому что может представлять состояние, не основанное на итерации. В примере это достигается увеличением счетчика orderCount.

    Можно выражать более сложные состояния, сочетая цикл while с другими формами управления потоком выполнения, такими как условные выражения, которые были рассмотрены, начиная с 19 шага. Посмотрите на этот пример:

    var isTavernOpen = true
    val isClosingTime = false
    while (isTavernOpen == true) {
        if (isClosingTime) {
            isTavernOpen = false
        }
        println("Having a grand old time!")
    }

    Здесь цикл while продолжает повторяться до тех пор, пока isTavernOpen истинно, а состояние представлено булевым значением. Это очень мощный инструмент, но он может быть опасен. Подумайте, что произойдет, если isTavernOpen никогда не получит ложного значения? Цикл while будет продолжаться бесконечно, и программа зависнет или продолжит выполняться бесконечно. Будьте осторожны, применяя цикл while.

    На следующем шаге мы рассмотрим оператор break.




Предыдущий шаг Содержание Следующий шаг