Циклы и диапазоны (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..51, 2, 3, 4, 5
1 until 51, 2, 3, 4
5 downTo 15, 4, 3, 2, 1
1..10 step 21, 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 повторяет блок, пока условие истинно.
Проверьте себя
1. Какие значения переберёт цикл for (i in 1 until 5)?
A1, 2, 3, 4, 5
B1, 2, 3, 4
C2, 3, 4, 5
D0, 1, 2, 3, 4
2. Как перебрать числа от 5 до 1 по убыванию?
Afor (i in 5..1)
Bfor (i in 5 downTo 1)
Cfor (i in 1..5 reversed)
Dfor (i in -5..-1)
3. Что напечатает for (i in 1..10 step 2)?
A1 2 3 4 5
B2 4 6 8 10
C1 3 5 7 9
D1 10