На этом шаге мы рассмотрим особенности использования этого цикла при работе со множествами.
Теперь, когда у вас есть список уникальных имен, пусть они сделают случайные заказы из меню. Однако в этом разделе вы должны использовать другой механизм для обхода коллекции: цикл 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.