Циклы и диапазоны (ranges)
Учимся повторять действия и перебирать значения по диапазонам.
Диапазон (range) — последовательность значений от начала до конца, которую удобно перебирать циклом; создаётся оператором
...
Циклы повторяют действия, а диапазоны задают, по каким значениям пройтись. В Kotlin цикл for работает не со счётчиком и условием, а напрямую с диапазоном или коллекцией — это короче и понятнее.
Диапазоны и цикл for
Запись 1..5 создаёт диапазон от 1 до 5 включительно. Цикл for перебирает его элементы.
fun main() {
for (i in 1..5) {
print("$i ")
}
println()
}Вывод:
1 2 3 4 5
until, downTo и step
Иногда верхняя граница не нужна (until), нужно идти вниз (downTo) или с шагом (step).
| Запись | Значения |
1..5 | 1, 2, 3, 4, 5 |
1 until 5 | 1, 2, 3, 4 |
5 downTo 1 | 5, 4, 3, 2, 1 |
1..10 step 2 | 1, 3, 5, 7, 9 |
fun main() {
for (i in 1..10 step 2) print("$i ")
println()
for (i in 3 downTo 1) print("$i ")
println()
}Вывод:
1 3 5 7 9 3 2 1
Перебор коллекций и while
Цикл for перебирает любую коллекцию. Если нужны индексы — есть indices. А while повторяет, пока условие истинно.
fun main() {
val fruits = listOf("яблоко", "банан", "вишня")
for (fruit in fruits) print("$fruit ")
println()
var n = 3
while (n > 0) {
print("$n ")
n--
}
println()
}Вывод:
яблоко банан вишня 3 2 1
Как работает под капотом
Диапазон 1..5 — это полноценный объект (IntRange), реализующий интерфейс перебора. Поэтому у него есть метод contains, и его можно использовать не только в цикле, но и в проверке x in 1..5. Цикл for под капотом просто запрашивает у диапазона или коллекции итератор и проходит по элементам — счётчик вручную вести не нужно.
Частые ошибки
- Путать
..иuntil.1..5включает 5, а1 until 5— нет. - Делать
downToчерез...5..1даст пустой диапазон; для убывания нуженdownTo. - Перебирать индексы, когда нужен элемент. Если индекс не важен, перебирайте сами элементы:
for (x in list).
Итог
- Диапазон создаётся оператором
..и включает обе границы. untilисключает верхнюю границу,downToидёт вниз,stepзадаёт шаг.forперебирает диапазоны и коллекции без ручного счётчика.whileповторяет блок, пока условие истинно.