Освоюємо 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")
}
Результат:
[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 ("кінець програми") // не буде виведено
}
Результат:
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")
}
Результат:
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")
}
Результат:
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")
}
Результат:
i=0, j=0 i=0, j=1 |