Освоюємо 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 |
Функція repeat()
[ред.]Функція repeat() не належить офіційно до циклів, але по суті виконує їхню роль. repeat() дозволяє виконати один і той самий набір інструкцій вказану кількість раз:
fun main() {
repeat(10){
println("Привіт")
}
}
В даному випадку слово Привіт буде виведено на консоль 10 раз.
Ми можемо одержати номер ітерації починаючи з нуля так:
fun main() {
repeat(10){
println("$it Привіт")
}
}
Результат:
0 Привіт 1 Привіт 2 Привіт 3 Привіт 4 Привіт 5 Привіт 6 Привіт 7 Привіт 8 Привіт 9 Привіт |
Можна також так:
repeat(4) { index ->
println("Iteration number: $index")
}
Функція forEach()
[ред.]Ще одна функція, яка може замінити цикл - це функція forEach(). За допомогою неї можна перебрати значення масивів або ж колекцій:
val fruits = arrayOf("Apple", "Banana", "Cherry")
// використання forEach з неявним параметром 'it'
fruits.forEach {
println("Fruit: $it")
}
// використання forEach з явним іменем параметру
fruits.forEach {name ->
println("Fruit2: $name")
}
//повторити інструкцію 5 разів можна так
(0..4).forEach {
println(it)
}
Результат:
Fruit: Apple Fruit: Banana Fruit: Cherry Fruit2: Apple Fruit2: Banana Fruit2: Cherry 0 1 2 3 4 |