Skip to content

区间与等差数列

Kotlin 中的区间与等差数列定义了值的序列,支持区间运算符、迭代、自定义步长值和等差数列。

区间

Kotlin 允许你使用 kotlin.ranges 包中的 rangeTo()rangeUntil() 函数轻松创建值区间。

区间表示一个有序的值集合,具有定义的起始值和结束值。默认情况下,它每步递增 1。例如,1..4 表示数字 1、2、3 和 4。

要创建:

  • 一个闭合区间,使用 .. 运算符调用 .rangeTo() 函数。这包括起始值和结束值。
  • 一个半开区间,使用 ..< 运算符调用 .rangeUntil() 函数。这包括起始值但不包括结束值。

例如:

kotlin
fun main() {
    // Closed-ended range: includes both 1 and 4
    println(4 in 1..4)
    // true
    
    // Open-ended range: includes 1, excludes 4
    println(4 in 1..<4)
    // false
}

区间在 for 循环中迭代时特别有用:

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

要以倒序迭代数字,请使用 downTo 函数代替 ..

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

你还可以使用 step() 函数以自定义步长迭代数字,而不是默认的步长 1:

kotlin
fun main() {
    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
}

等差数列

诸如 IntLongChar 等整数类型 (integral types) 的区间可以被视为 等差数列。在 Kotlin 中,这些等差数列由特殊类型定义:IntProgressionLongProgressionCharProgression

等差数列有三个基本属性:first 元素、last 元素和一个非零的 step。第一个元素是 first,后续元素是前一个元素加上 step。以正步长对等差数列进行迭代等同于 Java/JavaScript 中的带索引 for 循环。

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

当你通过迭代区间隐式创建等差数列时,该等差数列的 firstlast 元素是区间的端点,并且 step 为 1。

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

要定义自定义等差数列步长,请在区间上使用 step 函数。

kotlin

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

等差数列的 last 元素按以下方式计算:

  • 对于正步长:不大于结束值的最大值,使得 (last - first) % step == 0
  • 对于负步长:不小于结束值的最小值,使得 (last - first) % step == 0

因此,last 元素不总是与指定的结束值相同。

kotlin

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

等差数列实现了 Iterable<N>,其中 N 分别是 IntLongChar,因此你可以在各种 集合函数 中使用它们,例如 mapfilter 等。

kotlin

fun main() {
    println((1..10).filter { it % 2 == 0 })
    // [2, 4, 6, 8, 10]
}