侧边栏壁纸
博主头像
Z同学博主等级

工作磨平激情前,坚持技术的热忱。 欢迎光临Z同学的技术小站。 分享最新的互联网知识。

  • 累计撰写 274 篇文章
  • 累计创建 55 个标签
  • 累计收到 74 条评论

Kotlin -区间数列详解

Z同学
2021-09-24 / 0 评论 / 0 点赞 / 437 阅读 / 3,064 字
温馨提示:
本文最后更新于 2021-11-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

在kotlin定义中,区间数列都属于集合的一种。

而我们一般使用区间,都是通过操作符..来实现的。

示例:

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:

fun main(string: Array<String>) {
    //将区间 1..4 进行赋值给i 然后输出
    for (i in 1..4) { 
        println(i)
    }
}
//输出
1
2
3
4

这是正向输出,如果是反向输出,不能写4..1的形式。需要使用downTo()函数

示例2:

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:

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来创建了

示例:

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: 默认情况下。

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:

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 负数的情况

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类型:

fun main(string: Array<String>) {
    for (i in 'a'..'z'){
        print(i)
    }
}
//输出
abcdefghijklmnopqrstuvwxyz

还可以是long类型:

fun main(string: Array<String>) {
    for (i in 10L..20L){
        print("$i,")
    }
}
//输出
10,11,12,13,14,15,16,17,18,19,20,

char 类型带步长

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: 定义区间增长步长。

0

评论区