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的疯狂讲义
本书即将于2017年11月发售 敬请期待
往期连载