前言
在kotlin定义中,区间和数列都属于集合的一种。
而我们一般使用区间,都是通过操作符..
来实现的。
示例:
代码语言:javascript复制fun main(string: Array<String>) {
var i = 3
if (i in 1..4) { // 等同于 1 <= i && i <= 4
print(i)
}
}
//输出
3
关于操作符,可以看看我的这篇文章介绍。
Kotlin之中的操作符 - Z同学 (zinyan.com)
其实操作符只是将函数以符号的形式进行了简写而已。
区间的创建实际是使用 rangtTo()
函数来实现的
区间
我们通常使用的都是整数类型的区间。IntRange,LongRange,CharRange
可以通过源码阅读了解。上面类都存储在 kotlin/range 目类下。
因为区间参数都是等差数列。所以我们可以在for
循环中使用区间
示例1:
代码语言:javascript复制fun main(string: Array<String>) {
//将区间 1..4 进行赋值给i 然后输出
for (i in 1..4) {
println(i)
}
}
//输出
1
2
3
4
这是正向输出,如果是反向输出,不能写4..1
的形式。需要使用downTo()
函数
示例2:
代码语言:javascript复制fun main(string: Array<String>) {
//将区间4..1 进行赋值给i 然后输出
for (i in 4 downTo 1) {
println(i)
}
}
//输出
4
3
2
1
步长 step
默认情况下是按照等差数列, 1的形式进行循环。但是我们如果需要 2, 3的跨度呢?
那么就需要设置步长值了。函数:step
示例3:
代码语言:javascript复制fun main(string: Array<String>) {
//将区间 1..4 进行赋值给i 然后输出. 步长2
//意思就是每次循环 2
for (i in 4 downTo 1 step 2) {
println(i)
}
}
//输出
4
2
不管正序,还是倒叙,都可直接在后面添加step 并设置步长值。
截至 until
我们使用..
创建区间时,如果希望最大值不包含。那么我们就可以通过until
来创建了
示例:
代码语言:javascript复制fun main(string: Array<String>) {
println("区间范围: [1,4]")
for (i in 1..4) {
print(i)
}
println()
println("区间范围: [1,4)")
for (i in 2 until 4) {
print(i)
}
}
//输出
区间范围: [1,4]
1234
区间范围: [1,4)
23
翻转 reversed
我们如果得到一个区间数列,想进行从大到小的调整,可以使用翻转函数reversed()
。示例:
fun main(string: Array<String>) {
var range1:IntRange=1..10
println("区间:$range1")
var range2 =range1.reversed()
println("区间翻转后:$range2")
}
//输出
区间:1..10
区间翻转后:10 downTo 1 step 1
区间首尾 firsh 和last
如果是区间对象,我们可以打印区间对象的四种函数结果
可以得到,区间的开始元素first,结束元素last,区间最后元素endInclusive,区间循环开始元素start,步长step
示例1:默认情况下。
代码语言:javascript复制var range1: IntRange = 1..10
println("first :${range1.first}")
println("last :${range1.last}")
println("endInclusive :${range1.endInclusive}")
println("start :${range1.start}")
println("step :${range1.step}")
//输出:
first :1
last :10
endInclusive :10
start :1
step :1
如果我们针对step 做一些调整,那么last 参数就会发生变化了。同时 endInclusive 和start 将无法使用。
示例2:
代码语言:javascript复制fun main(string: Array<String>) {
var range1 = 1..10 step (2)
println("first :${range1.first}")
println("last :${range1.last}")
// println("endInclusive :${range1.endInclusive}")
// println("start :${range1.start}")
println("step :${range1.step}")
}
//输出
first :1
last :9
step :2
因为last 是通过计算满足条件后区间可以提供的最大值。
计算逻辑是:
- 对于正步长(从小到大的区间):不大于结束值且满足
(last - first) % step == 0
的最大值。 - 对于负步长(从大到小的区间):不小于结束值且满足
(last - first) % step == 0
的最小值。
示例3:step 负数的情况
代码语言:javascript复制fun main(string: Array<String>) {
var range2 = 10 downTo 1 step 2
println("first :${range2.first}")
println("last :${range2.last}")
println("step :${range2.step}")
}
//输出
first :10
last :2
step :-2
其他函数区间样例
在上面主要的示例都是Int型的。但是其实除了int 还有其他类型的
还可以是char类型:
代码语言:javascript复制fun main(string: Array<String>) {
for (i in 'a'..'z'){
print(i)
}
}
//输出
abcdefghijklmnopqrstuvwxyz
还可以是long类型:
代码语言:javascript复制fun main(string: Array<String>) {
for (i in 10L..20L){
print("$i,")
}
}
//输出
10,11,12,13,14,15,16,17,18,19,20,
char 类型带步长
代码语言:javascript复制fun main(string: Array<String>) {
var s = 'a'..'z' step 2
for(i in s){
print(i)
}
println()
println("first :${s.first}")
println("last :${s.last}")
println("step :${s.step}")
}
//输出
acegikmoqsuwy
first :a
last :y
step :2
方法总结
在区间,实用的方法
rangeTo()
:定义升序区间,数值从小到大。可以用..
代替
downTo()
: 定义降序区间,数值从大到小。
reversed()
: 区间翻转。上面有示例代码介绍。
step
: 定义区间增长步长。