Циклы

Циклы

Циклы повторяют выполнение одного и того же блока кода несколько раз пока не наступает условие выхода из цикла. Условием выхода является булево значение: достижение конца коллекции, наступление конца диапазона, отсутствие следующего объекта итератора и т.д.

Итерация цикла – каждое повторение кода в теле цикла.

Итератор – объект, который позволяет получить последовательный доступ к элементам коллекции.

Цикл for

Цикл for итерирует что-угодно, что имеет итератор. Допустимы объекты к итератору которых можно получить доступ посредством вызова функции iterator(), в котором есть функции next и hasNext, которые возвращают булевы значения: true или false.

Получение один за другим элементов коллекции:

for (item in collection) {
	// Выполнить какой-либо код
}

Итерация по диапазону чисел:

for (i in 0.10) {
	println(i) // В каждом повторе цикла выводит значение начиная от 0, 1, 2 …. 10 
}
for (i in 10 downTo 0 step 2) {
	println(i) // Значение i вначале равно 10 затем в каждой итерации цикла оно уменьшается на 2 до достижения значения 0
}

Итерацию можно проводить посредством индексов массива, так как свойство indices массива имеет тип IntRange, что представляет собой диапазон значений от 0 до последнего индекса массива:

for (i in array.indices) {
    println(array[i])
}

Цикл while и do-while

Цикл while получает один параметр типа Boolean и пока значение этого параметра true цикл продолжает выполнение.

В примере ниже цикл повторяется 10 раз печатая значения начиная от 0 до 10. 10 не выводится, так как условие выполнение цикла становится false, так как проверка 10 < 10 равно false (10 не может быть меньше 10)

var x = 0
while (x < 10) {
println(x)
x++ // Увеличивает значение на 1
}

Цикл do-while выполняется по крайней мере один раз, так как сначала выполняется блок do, а затем уже проверяется условие посредством while, который также получает параметр типа Boolean.

На примере использования итератора массива видно, что значением, которое проверяется в while является булево значение, которое возвращает true пока есть следующий объект в массиве и возвращает false, когда в блоке do получаем доступ к последнему элементу и выводим его в консоль:

val array = arrayOf<Int>(1, 2, 3, 4, 5)
val iter = array.iterator()
do {
    println(iter.next())
} while (iter.hasNext())

Прерывание и пропуск итерации цикла

Циклы можно прерывать досрочно, используя оператор break.

На примере ниже показано, как при достижении значения 4 выполнение цикла прерывается и код продолжает своё выполнение начиная со строки после цикла:

for(i in 0..10) {
    println(i)
    if (i == 3) break // На заметку. Если в теле используется только одна строка кода, блок открывать необязательно
}

Для пропуска итерации цикла можно использовать оператор continue.

В примере ниже цикл выводит только нечетные значения, так как при присвоении четного значения переменной i проверяется четность путём расчёта остатка от деления и если оно равно 0 то итерация пропускается так как задача оператора continue перейти сразу на следующую итерацию:

for (i in 0..10) {
    if (i % 2 == 0) continue
    println(i)
}

Операторы break и continue относятся к ближайшему циклу и в случае использования двух или более вложенных циклов, если есть необходимость прервать внешний цикл, необходимо использовать метки. Метка пишется до цикла и заканчивается символом @:

myloop@ for (i in 0..10) {
    for (j in 0..10) {
        // Метка для прерывания внешнего цикла разделяется от оператора символом @
        if (i == 5) break@myloop
    }
}