🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 区间与数列 [TOC] kotlin允许您使用`kotlin.ranges`包中的[rangeto()](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.ranges/range-to.html)函数轻松创建区间,也可以使用".."代替`rangeto()`函数。通常,`rangeto()`函数需要通过`in`或`!in`操作。 ```kotlin if (i in 1..4) { // 等同于 1 <= i && i <= 4 print(i) } ``` 整数类型区间([`IntRange`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.ranges/-int-range/index.html), [`LongRange`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.ranges/-long-range/index.html), [`CharRange`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.ranges/-char-range/index.html))有一个额外的特性:它们可以迭代。这些区间也是相应整数类型的[数列](https://en.wikipedia.org/wiki/Arithmetic_progression)。这些区间通常用`for`循环进行迭代 ```kotlin fun main() { //sampleStart for (i in 1..4) print(i) //sampleEnd } ``` 运行结果 ``` 1234 ``` 若要以相反的顺序迭代数据,请使用downto函数而不是`..` ```kotlin fun main() { //sampleStart for (i in 4 downTo 1) print(i) //sampleEnd } ``` 运行结果 ``` 4321 ``` 区间也可以用任意步长(不一定是1)迭代数据。这是通过 [`step`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.ranges/step.html) 函数完成的。 ```kotlin fun main() { //sampleStart for (i in 1..8 step 2) print(i) println() for (i in 8 downTo 1 step 2) print(i) //sampleEnd } ``` 运行结果 ``` 1357 8642 ``` 若要迭代不包含结束元素的数字范围,请使用 [`until`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.ranges/until.html)函数: ```kotlin fun main() { //sampleStart for (i in 1 until 10) { // i in [1, 10), 10 is excluded print(i) } //sampleEnd } ``` 运行结果 ``` 123456789 ``` ## 区间 区间在数学意义上定义了一个封闭的区间:它由两个端点值定义,这两个端点值都被包含在该区间内。区间是为可比较类型定义的:有序,您可以定义任意实例是否在两个给定实例之间的区间内。区间的主要操作是`contains`,它通常以`in`和`!in`操作。 要为您的类创建一个区间,请对区间起始值调用`rangeto()`函数,并将结束值作为参数提供。`rangeto()`通常以其运算符形式`..`被调用。 ```kotlin class Version(val major: Int, val minor: Int): Comparable<Version> { override fun compareTo(other: Version): Int { if (this.major != other.major) { return this.major - other.major } return this.minor - other.minor } } fun main() { //sampleStart val versionRange = Version(1, 11)..Version(1, 30) println(Version(0, 9) in versionRange) println(Version(1, 20) in versionRange) //sampleEnd } ``` 运行结果 ``` false true ``` ## 数列 如以上示例所示,整数类型的范围,如`int`、`Long`和`Char`,可以视为它们的[算术数列](https://en.wikipedia.org/wiki/Arithmetic_progression)。在kotlin中,这些级数由特殊类型定义:[`IntProgression`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.ranges/-int-progression/index.html), [`LongProgression`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.ranges/-long-progression/index.html),和 [`CharProgression`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.ranges/-char-progression/index.html)。 数列有三个基本属性:第一个元素、最后一个元素和非零步长。第一个元素是第一个,后续元素是前一个元素加上一个步长。最后一个元素总是被迭代命中,除非数列为空。用正向区间迭代一个数列相当于Java或JavaScript中的索引for循环。 ```java for (int i = first; i <= last; i += step) { // …… } ``` 当您通过迭代一个区间隐式创建一个数列时,该数列的第一个和最后一个元素是该区间的端点,步长为1。 ```kotlin fun main() { //sampleStart for (i in 1..10) print(i) //sampleEnd } ``` 运行结果 ``` 12345678910 ``` 为了自定义一个数列步长,可以使用`step`函数在区间上 ```kotlin fun main() { //sampleStart for (i in 1..8 step 2) print(i) //sampleEnd } ``` 运行结果 ``` 1357 ``` 计算数列的最后一个元素,以找到不大于正阶跃结束值的最大值或不小于负阶跃结束值的最小值,比如`(last - first) % step == 0`。要创建以相反顺序迭代的数列,请使用downto而不是`..`当定义它的区间时。 ```kotlin fun main() { //sampleStart for (i in 4 downTo 1) print(i) //sampleEnd } ``` 运行结果 ``` 4321 ``` 数列实现了接口`Iterable<N>`,其中`N`分别是int、`Long`或 `Char`,因此您可以在各种[集合函数](https://www.kancloud.cn/book/alex_wsc/android_kotlin/collection-operations.html)中使用它们,如map、filter和其他函数。 ```kotlin fun main() { //sampleStart println((1..10).filter { it % 2 == 0 }) //sampleEnd } ``` 运行结果 ``` [2, 4, 6, 8, 10] ```