区间与数列

    整数类型区间(、LongRange、)还有一个拓展特性:可以对其进行迭代。 这些区间也是相应整数类型的等差数列。 这种区间通常用于 for 循环中的迭代。

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

    要反向迭代数字,请使用 函数而不是 ..

    1. fun main() {
    2. //sampleStart
    3. for (i in 4 downTo 1) print(i)
    4. //sampleEnd
    5. }

    也可以通过任意步长(不一定为 1 )迭代数字。 这是通过 step 函数完成的。

    1. fun main() {
    2. //sampleStart
    3. for (i in 1..8 step 2) print(i)
    4. println()
    5. for (i in 8 downTo 1 step 2) print(i)
    6. //sampleEnd
    7. }

    要迭代不包含其结束元素的数字区间,请使用 函数:

    要为类创建一个区间,请在区间起始值上调用 rangeTo() 函数,并提供结束值作为参数。 通常以操作符 .. 形式调用。

    1. override fun compareTo(other: Version): Int {
    2. if (this.major != other.major) {
    3. return this.major - other.major
    4. }
    5. return this.minor - other.minor
    6. }
    7. }
    8. fun main() {
    9. //sampleStart
    10. val versionRange = Version(1, 11)..Version(1, 30)
    11. println(Version(0, 9) in versionRange)
    12. println(Version(1, 20) in versionRange)
    13. //sampleEnd
    14. }

    数列

    如上个示例所示,整数类型的区间(例如 IntLongChar)可视为等差数列。 在 Kotlin 中,这些数列由特殊类型定义:、LongProgression 与 。

    数列具有三个基本属性:first 元素、last 元素和一个非零的 step。 首个元素为 first,后续元素是前一个元素加上一个 step。 以确定的步长在数列上进行迭代等效于 Java/JavaScript 中基于索引的 for 循环。

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

    通过迭代数列隐式创建区间时,此数列的 firstlast 元素是区间的端点, 为 1 。

    1. fun main() {
    2. for (i in 1..10) print(i)
    3. //sampleEnd
    4. }

    数列的 last 元素是这样计算的:

    • 对于正步长:不大于结束值且满足 (last - first) % step == 0 的最大值。
    • 对于负步长:不小于结束值且满足 (last - first) % step == 0 的最小值。

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

    1. fun main() {
    2. //sampleStart
    3. for (i in 1..9 step 3) print(i) // 最后一个元素是 7
    4. //sampleEnd
    5. }

    要创建反向迭代的数列,请在定义其区间时使用 downTo 而不是 ..

    1. fun main() {
    2. //sampleStart
    3. for (i in 4 downTo 1) print(i)
    4. //sampleEnd
    5. }

    数列实现 Iterable<N>,其中 N 分别是 IntLongChar,因此可以在各种集合函数(如 mapfilter 与其他)中使用它们。

    1. fun main() {
    2. //sampleStart
    3. println((1..10).filter { it % 2 == 0 })
    4. //sampleEnd