Освой Kotlin играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Цикл for в Kotlin имеет другой синтаксис. Применим в тех случаях, когда есть итератор - массив, Map и т.д. Стандартный вариант, когда нужно пробежаться по заданному числу элементов, описывается следующим образом. Если для цикла используется одна команда, можно обойтись без фигурных скобок, но проще всегда использовать блок.
for(i in 1..5)
println(i)
for(i in 1..5){
println(i)
}
Оператор in и его брат !in проверяют вхождение или отсутствие вхождения в диапазон.
В выражении 1..5 мы указываем диапазон от 1 до 5 (пять входит в диапазон). Переменная последовательно примет значение
1
2
3
4
5
Диапазон можно заменить переменной.
val range = 1..5
for(i in range){
println("Элемент $i")
}
Вместо диапазона можно указать массив.
val cats = arrayListOf<String>()
cats.add("Мурзик")
cats.add("Васька")
cats.add("Барсик")
for(cat in cats){
println("Кот $cat")
}
// Результат
Кот Мурзик
Кот Васька
Кот Барсик
Этот же пример можно переписать, используя индекс:
for (index in cats.indices){
println("Кот ${cats[index]}")
}
Проверим, является ли символ не цифрой.
fun isNotDigit(c: Char) = c !in '0'..'9'
println(isNotDigit('3')) // false, это всё-таки цифра
С помощью index, element и withIndex() можно получить индекс и его значение в массиве.
val cats = arrayListOf("Barsik", "Murzik", "Vaska")
for( (index, element) in cats.withIndex()){
println("$index: $element")
}
Получим.
0: Мурзик
1: Васька
2: Барсик
А как быть с вариантами, когда нужно счётчик не увеличивать на единицу, а уменьшать на 2? Используем ключевые слова downTo и step.
for(i in 10 downTo 1 step 2){
print("$i ")
}
// выводит: 10 8 6 4 2
Без указания шага значения будут уменьшаться на единицу.
for(i in 10 downTo 1){
print("$i ")
}
// 10 9 8 7 6 5 4 3 2 1
for (letter in 'Z' downTo 'A') print(letter)
// ZYXWVUTSRQPONMLKJIHGFEDCBA
Очень часто в циклах встречается выражение size-1, чтобы не выйти за пределы массива. Можно заменить на until.
for(i in 0..cats.size - 1){
println(cats[i])
}
for(i in 0 until cats.size){
println(cats[i])
}
Хотим выйти из цикла при достижении какого-то значения.
for (i in 1..5) {
println(i)
// прекращаем перебор, когда достигнем значения 3
if (i == 3)
break
}
// Получим
1
2
3
Ключевое слово continue позволяет продолжить перебор, при этом можно что-то сделать во время перебора, например, мяукнуть. Число 5 при этом не выводится.
println("For loop 1 to 10 continue if number is 5")
for (i in 1..10) {
if (i == 5) {
println("Meow")
continue
}
println(i)
}
// Результат
For loop 1 to 10 continue if number is 5
1
2
3
4
Meow
6
7
8
9
10
Часто используют два цикла for. Простейший вариант.
// первый цикл
for(x in 1..3){
// второй вложенный цикл
for(y in 1..3){
print("$x $y \n")
}
}
// результат
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3
Если мы хотим досрочно прервать на каком-то этапе цикл, то можем добавить аннотацию [email protected] к первому циклу и внутри второго цикла вызвать [email protected]. Как только значения станут равными (2 2), цикл завершится досрочно.
// первый цикл
[email protected] for (x in 1..3) {
// второй вложенный цикл
for (y in 1..3) {
print("$x $y \n")
if (x == 2 && y == 2)
[email protected]
}
}
// результат
1 1
1 2
1 3
2 1
2 2
Пройтись по всем элементам коллекции.
val daysOfWeek = listOf("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday")
daysOfWeek.forEach{
println(it)
}
Встроенная функция для повторения команд заданное число раз.
repeat(3){
println("Васька! Иди жрать!")
}
Цикл while работает стандартным способом - пока условие остаётся истинным, выполняются команды в блоке цикла. Если код после условия цикла состоит из одной строчки, то фигурные скобки можно опустить.
var i = 1
while (i < 9) {
println(i)
i = i + 1
}
// вышли из цикла и проверяем последнее значение переменной
println(i) // 9
Обратите внимание, что внутри цикла мы получим числа от 0 до 8, но если проверить, чему равно значение переменной после цикла, то увидим, что оно больше.
Прервать цикл можно через break.
var i = 1
while (i < 9) {
if (i == 5){
break
}
println(i)
i += 1
}
// результат
1
2
3
4
Выполняем какую-то работу, пока выполняется какое-то условие - выводим число, которое увеличивается на единицу, пока число меньше 10.
var i = 1
do {
println(i)
i++
} while (i < 10)
Можно прервать цикл через break. Когда число станет равным 5, цикл прекратится.
var i = 1
do {
println(i)
if (i == 5)
break
i++
} while (i < 10)