Диапазоны, или интервалы, и прогрессии в Kotlin
В Kotlin диапазоны, они же интервалы, представляют собой объекты, которые содержат все целые числа в заданном промежутке последовательно от меньшего к большему. Прогрессии в Kotlin могут содержать числа от большего к меньшему, а также с заданным шагом.
Одно из наиболее частых применений интервалов и прогрессий – их использование в заголовке цикла for
.
Диапазоны и прогрессии не являются итераторами. Для их превращения в итератор вызывается функция iterator()
.
Только целочисленные типы могут формировать интервалы и прогрессии. Есть классы диапазонов IntRange
, LongRange
, CharRange
. По-умолчанию используется IntRange
. В случае CharRange
для указания границ диапазона используются символы. Как известно, на самом деле символы кодируются числами. Если при создании был задан обратный порядок и/или использовался шаг, то создается объект класса IntProgression
. Также есть LongProgression
, CharProgression
.
В Kotlin диапазоны создаются с помощью операторов интервала – двух точек ..
и until
. В классах их переопределяют соответствующие функции. В обоих случаях объект будет содержать линейный набор значений. В случае двух точек создается истинный интервал, содержащий все значения от находящегося слева до находящегося справа от оператора, включая крайние. В случае until
крайнее верхнее значение в диапазон входить не будет.
fun main() { val a = 1..4 val b = 1 until 4 for (i in a) print(i) // 1234 println() for (i in b) print(i) // 123 }
Принадлежность значения интервалу проверяется операторами in
и !in
.
fun main() { val a = "String" val b = if (a[3] in 'k'..'z') "Yes" else a[3].toString() println(b) // i }
С оператором when
:
fun main() { val a = "String" val b = when (a[3]) { in 'k'..'z' -> "Yes" else -> a[3].toString() } println(b) // i }
Проверка на невхождение в интервал:
fun main() { val a = 1..3 val b = 1 println(b !in a) // false }
Для обратного хода и шага используются операторы-функции downTo
и step
:
fun main() { val a = 1..9 step 3 val b = 1 until 10 step 2 val c = 0 downTo -4 val d = 'z' downTo 'a' step 5 for (i in a) print(i) // 147 println() for (i in b) print(i) // 13579 println() for (i in c) print(" $i") // 0 -1 -2 -3 -4 println() for (i in d) print(i) // zupkfa }
Функция toList()
преобразует интервал в список.
fun main() { val a = 1..3 val b = 1 until 3 val c = 3 downTo 1 println(a.toList()) // [1, 2, 3] println(b.toList()) // [1, 2] println(c.toList()) // [3, 2, 1] }
PDF-версия курса с дополнительными уроками