Перейти до вмісту

Освоюємо Kotlin/Цикли

Матеріал з Вікіпідручника


Цикли

[ред.]

Цикл while

[ред.]

Звичний цикл з передумовою while працює в Kotlin як і в інших мовах:

var x=1
while (x<20){
   x=x+1
}

Тобто спочатку перевіряється умова. Якщо умова вірна, то виконується тіло циклу.

Цикл do-while

[ред.]

У циклі do-while тіло циклу виконується хоча б раз. Після першого виконання, перевіряється умова, якщо вона вірна, то цикл виконується повторно.

 var y=10
 do {
     y--
     print("y=$y")
 } while (y>10)

В даному випадку цикл виконається лише один раз і буде виведено число 9.

Цикл for

[ред.]

Цикл for дозволяє здійснити перебір чисел в певному діапазоні і має вигляд:

for (x in 1..15){
    //код програми
}

Якщо потрібно, щоб останній елемент не включався використовують замість .. ключове слово until:

for (x in 1 until 100) println(x)  // виведе числа від 1 до 99

Зверніть увагу, що якщо цикл складається з одного рядка, то фігурні дужки можна опустити.

Для перебору в зворотньому порядку використовується ключове слово downTo.

for (x in 15 downTo 1) println(x)

Якщо потрібно перебирати не з одиничним кроком, то можна використати ключове слово step для задання кроку перебору.

for (x in 1..100 step 2) println(x)

Існує можливість перебрати всі елементи масиву наступним чином:

var myArray: Array<Byte> = arrayOf(1, 2, 3)
for (item in myArray){
    println("myArray has $item")
}

Можна перебрати масив використовуючи його індекси:

    var myArray: Array<Byte> = arrayOf(1, 2, 3)
    for (index in myArray.indices){
        println("$index =${myArray[index]}")
    }

Більш того, можна одночасно пройтися і по індексам і по значенням масиву:

    var myArray: Array<Byte> = arrayOf(1, 2, 3, 5)
    for ((index, item) in myArray.withIndex()){
        println("[$index] =$item")
    }
Standard input or output Результат:
[0] =1
[1] =2
[2] =3
[3] =5

Return, continue, break

[ред.]

В циклах можна використовувати ключові слова return, continue, break. Так, якщо ми маємо два цикли, вкладені один в оден, то return завершить виконання обох циклів і виконання функції, в якій є ці цикли:

fun main() {
    for (i in 0 until 10) {
        for (j in 0 until 10) {
            if (j == 2) {
                return
            }
            println("i=$i, j=$j")
        }
    }
    println ("кінець програми") // не буде виведено
}
Standard input or output Результат:
i=0, j=0
i=0, j=1

Continue завершує поточну ітерацію циклу і переходить до наступної:

    for (i in 0 until 10){
        for (j in 0 until 10){
        if (j==2){
            continue
        }
        println("i=$i, j=$j")
    }
Standard input or output Результат:
i=0, j=0
i=0, j=1
i=0, j=3
i=0, j=4
i=0, j=5
i=0, j=6
i=0, j=7
i=0, j=8
i=0, j=9
i=1, j=0
i=1, j=1
i=1, j=3
i=1, j=4
i=1, j=5
i=1, j=6
i=1, j=7
i=1, j=8
i=1, j=9
i=2, j=0
i=2, j=1
i=2, j=3
i=2, j=4
i=2, j=5
i=2, j=6
i=2, j=7
i=2, j=8
i=2, j=9
i=3, j=0
i=3, j=1
i=3, j=3
i=3, j=4
i=3, j=5
i=3, j=6
i=3, j=7
i=3, j=8
i=3, j=9
...
i=9, j=0
i=9, j=1
i=9, j=3
i=9, j=4
i=9, j=5
i=9, j=6
i=9, j=7
i=9, j=8
i=9, j=9

Як бачимо j=2 не друкується.

break - завершує поточний цикл і продовжується виконання зовнішнього циклу:

    for (i in 0 until 10){
        for (j in 0 until 10){
        if (j==2){
            break
        }
        println("i=$i, j=$j")
    }
Standard input or output Результат:
i=0, j=0
i=0, j=1
i=1, j=0
i=1, j=1
i=2, j=0
i=2, j=1
i=3, j=0
i=3, j=1
i=4, j=0
i=4, j=1
i=5, j=0
i=5, j=1
i=6, j=0
i=6, j=1
i=7, j=0
i=7, j=1
i=8, j=0
i=8, j=1
i=9, j=0
i=9, j=1

Як бачимо після j=1, цикл з j не продовжується.

Дещо надати наглядності і змінити поведінку break та continue (не return) можна з допомогою міток:

    outer@for (i in 0 until 10){
        inner@for (j in 0 until 10){
        if (j==2){
            break@inner // стандартне виконання break
        }
        println("i=$i, j=$j")
    }

Результат буде такий же, як і без міток. Проте, якщо ми змінемо break@inner на break@outer то break завершить обидва цикли:

    outer@for (i in 0 until 10){
        inner@for (j in 0 until 10){
        if (j==2){
            break@outer
        }
        println("i=$i, j=$j")
    }
Standard input or output Результат:
i=0, j=0
i=0, j=1