3.3 区间运算符
Kotlin提供了两个区间运算符,它们都可以非常方便地构建一种数据结构,这种数据结构可包含特定区间内的所有值。
3.3.1闭区间运算符
闭区间运算符a .. b用于定义一个从a~b(包括a、b边界值)的所有值的区间,对于闭区间运算符而言,a不能大于b,否则程序运行时将会报错。
Kotlin的for-in循环可用于遍历区间内的所有数据。例如如下代码。
程序清单:codes\03\3.3\RangeTest.kt
fun main(args: Array<String>) {
//使用闭区间运算符定义区间
var range1 = 2 .. 6
for( num in range1 ) {
println("${num} * 5 = ${num * 5}")
}
}
上面粗体字代码构建了一个区间,该区间包含2~6的所有数值,包括2、3、4、5、6这5个值。
3.3.2 半开区间运算符
半开区间运算符a until b用于定义一个从a~b(包括a边界值,但不包含b边界值)的所有值的区间,半开区间运算符与闭区间运算符类似,a也不能大于b。
如果a until b中边界a与边界b的值相等,就会产生一个空区间,该区间不包含任何值;如果a .. b中边界a与边界b的值相等,就会产生一个只包含一个值的区间,该区间只包含一个边界值。
利用半开区间遍历数组等列表(数组元素的索引是0到长度减1)时非常方便,例如如下程序(程序清单同上)://定义数组
val books = arrayOf("Swift" , "Kotlin" , "C" , "C++")
//使用半开区间运算符定义区间
for ( index in 0 until books.size) {
println("第${index+1}种语言是:${books[index]}")
}
上面程序构建了0 until books.size的区间,其中books.size返回数组元素的个数,也就是4,而且此处使用的是半开区间,因此该区间代表0、1、2、3等数值。
3.3.3 反向区间
如果程序希望区间可以从大到小,则可使用downTo运算符(其实是一个infix函数),该函数同样构建一个闭区间。对于a downTo b而言,此时要求b不能大于a。
例如如下程序使用downTo定义了反向区间。
程序清单:codes\03\3.3\DownToTest.kt
fun main(args: Array<String>) {
//使用反向闭区间运算符定义区间
var range1 = 6 downTo 2
for( num in range1 ) {
println("${num} * 5 = ${num * 5}")
}
}
上面程序使用downTo定义的区间将会从6逆序降到2,上面程序的输出结果如下所示。
6 * 5 = 30
5 * 5 = 25
4 * 5 = 20
3 * 5 = 15
2 * 5 = 10
3.3.3 区间步长
前面我们见到的所有区间的默认步长都是1,也就是区间内两个值之间的差值是1。而通过step
运算符(其实是一个infix函数)可以显式指定区间的步长。例如如下程序(程序清单同上)。
//为反向闭区间指定步长
for( num in 7 downTo 1 step 2 ) {
println("${num} * 5 = ${num * 5}")
}
上面程序使用downTo定义的区间将会从7逆序降到1,且步长为2,上面程序的输出结果如下所示。
7 * 5 = 35
5 * 5 = 25
3 * 5 = 15
1 * 5 = 5
以上内容节选自《疯狂Kotlin讲义》:一本让您最直接认识Kotlin的疯狂讲义

往期连载