Spec-Zone.ru › Kotlin 1.9

Диапазоны и прогрессии

Kotlin позволяет легко создавать диапазоны значений с помощью функций .rangeTo() и .rangeUntil() из пакета kotlin.ranges.

Для создания:

  • диапазона с включенными границами, вызовите функцию .rangeTo() с оператором ...

  • диапазона с исключёнными границами, вызовите функцию .rangeUntil() с оператором ..<.

Например:

fun main() {
//sampleStart
    // Closed-ended range
    println(4 in 1..4)
    // true
    
    // Open-ended range
    println(4 in 1..<4)
    // false
//sampleEnd
}

Диапазоны особенно полезны для итерации по for циклам:

fun main() {
//sampleStart
    for (i in 1..4) print(i)
    // 1234
//sampleEnd
}

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

fun main() {
//sampleStart
    for (i in 4 downTo 1) print(i)
    // 4321
//sampleEnd
}

Также возможно итерировать по числам с произвольным шагом (не обязательно 1). Это делается с помощью функции step.

fun main() {
//sampleStart
    for (i in 0..8 step 2) print(i)
    println()
    // 02468
    for (i in 0..<8 step 2) print(i)
    println()
    // 0246
    for (i in 8 downTo 0 step 2) print(i)
    // 86420
//sampleEnd
}

Прогрессии

Диапазоны целочисленных типов, таких как Int, Long, и Char, могут быть представлены как арифметические прогрессии. В Kotlin эти прогрессии определяются специальными типами: IntProgression, LongProgression и CharProgression.

Прогрессии имеют три ключевых свойства: элемент first, элемент last и ненулевой step. Первый элемент — это first, последующие элементы — это предыдущий элемент плюс step. Итерация по прогрессии с положительным шагом эквивалентна индексированному for циклу в Java/JavaScript.

for (int i = first; i <= last; i += step) {
  // ...
}

Когда вы неявно создаёте прогрессию, итерируя диапазон, элементы first и last этой прогрессии являются конечными точками диапазона, а step равно 1.

fun main() {
//sampleStart
    for (i in 1..10) print(i)
    // 12345678910
//sampleEnd
}

Для определения пользовательского шага прогрессии используйте функцию step для диапазона.

fun main() {
//sampleStart
    for (i in 1..8 step 2) print(i)
    // 1357
//sampleEnd
}

Элемент last прогрессии вычисляется следующим образом:

  • Для положительного шага: максимальное значение, не большее, чем конечное значение, такое что (last - first) % step == 0.

  • Для отрицательного шага: минимальное значение, не меньшее, чем конечное значение, такое что (last - first) % step == 0.

Таким образом, элемент last не всегда совпадает со значением указанной конечной точки.

fun main() {
//sampleStart
    for (i in 1..9 step 3) print(i) // the last element is 7
    // 147
//sampleEnd
}

Прогрессии реализуют Iterable<N>, где N это Int, Long, или Char соответственно, поэтому вы можете использовать их в различных функциях для коллекций, таких как map, filter, и других.

fun main() {
//sampleStart
    println((1..10).filter { it % 2 == 0 })
    // [2, 4, 6, 8, 10]
//sampleEnd
}
Последнее изменение: 06 июля 2023
Итераторы Последовательности

© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/ranges.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API