跳转到内容

Kotlin区间(Ranges)

来自代码酷

模板:Note

Kotlin区间(Ranges)[编辑 | 编辑源代码]

区间(Range)是Kotlin中表示一系列连续值的特殊结构,支持数字、字符等多种类型。区间通过操作符..untildownTo等实现,是控制流和集合操作的重要基础。

基础概念[编辑 | 编辑源代码]

区间表示数学中的闭区间或半开区间,包含以下核心特性:

  • 包含边界:如1..4包含1,2,3,4
  • 迭代能力:可用于循环遍历
  • 包含检测:通过in操作符检查元素是否属于区间

数学表示[编辑 | 编辑源代码]

闭区间表示为:[a,b]={xaxb}
半开区间表示为:[a,b)={xax<b}

区间创建[编辑 | 编辑源代码]

Kotlin提供多种创建区间的方式:

基本语法[编辑 | 编辑源代码]

// 闭区间(包含两端)
val intRange = 1..10  
val charRange = 'a'..'z'

// 半开区间(不包含结束值)
val halfOpenRange = 1 until 10  // 1..9

// 递减区间
val downRange = 10 downTo 1

区间类型[编辑 | 编辑源代码]

类型 示例 等效数学表示
闭区间 1..4 [1,4]
半开区间 1 until 4 [1,4)
递减区间 4 downTo 1 [4,1]

区间操作[编辑 | 编辑源代码]

遍历区间[编辑 | 编辑源代码]

for (i in 1..4) print(i)  // 输出:1234
for (i in 4 downTo 1) print(i)  // 输出:4321
for (i in 1 until 4) print(i)  // 输出:123

步长控制[编辑 | 编辑源代码]

使用step指定迭代步长:

for (i in 1..10 step 2) print("$i ")  // 输出:1 3 5 7 9 
for (i in 10 downTo 1 step 3) print("$i ")  // 输出:10 7 4 1

包含检测[编辑 | 编辑源代码]

val range = 1..10
println(5 in range)  // true
println(15 in range) // false
println(5 !in range) // false

特殊区间类型[编辑 | 编辑源代码]

字符区间[编辑 | 编辑源代码]

for (ch in 'a'..'d') print(ch)  // 输出:abcd
if ('c' in 'a'..'f') println("包含")  // 输出:包含

自定义区间[编辑 | 编辑源代码]

通过实现Comparable接口创建自定义类的区间:

class Date(val year: Int, val month: Int) : Comparable<Date> {
    override fun compareTo(other: Date): Int = 
        when {
            year != other.year -> year - other.year
            else -> month - other.month
        }
}

val dateRange = Date(2023,1)..Date(2023,12)
println(Date(2023,6) in dateRange)  // true

实际应用案例[编辑 | 编辑源代码]

成绩等级判断[编辑 | 编辑源代码]

fun getGrade(score: Int): String = when(score) {
    in 90..100 -> "A"
    in 80 until 90 -> "B"
    in 70 until 80 -> "C"
    in 60 until 70 -> "D"
    else -> "F"
}

println(getGrade(85))  // 输出:B

集合过滤[编辑 | 编辑源代码]

val numbers = listOf(1, 3, 7, 10, 15)
val filtered = numbers.filter { it in 5..12 }
println(filtered)  // 输出:[7, 10]

图形绘制范围[编辑 | 编辑源代码]

graph TD A[开始] --> B{坐标在画布内?} B -->|x in 0..800<br>y in 0..600| C[绘制像素] B -->|超出范围| D[跳过绘制]

性能考虑[编辑 | 编辑源代码]

  • 区间对象会缓存边界值,重复使用相同区间不会产生额外开销
  • 对于大型区间(如1..1_000_000),建议使用序列(Sequence)进行惰性计算
// 高效处理大区间
(1..1_000_000).asSequence()
    .filter { it % 2 == 0 }
    .take(10)
    .forEach { println(it) }

常见问题[编辑 | 编辑源代码]

页面模块:Message box/ambox.css没有内容。

  • 1 until 1是空区间
  • 10 downTo 1 step -1会导致无限循环
  • 浮点数区间应使用BigDecimal而非默认浮点类型

模板:Tip

  • 优先使用until避免数组越界
  • 对复杂判断条件,可将区间存储在变量中复用
  • 使用when表达式配合区间实现清晰的条件分支

进阶用法[编辑 | 编辑源代码]

区间运算[编辑 | 编辑源代码]

Kotlin支持区间交集、并集等操作:

val range1 = 1..10
val range2 = 5..15

// 交集
println(range1 intersect range2)  // 5..10

// 连续区间检测
println(range1 contiguousTo 11..20)  // false

无限区间[编辑 | 编辑源代码]

通过自定义实现可创建无限区间:

val infiniteRange = 1..Int.MAX_VALUE
println(infiniteRange.take(5).toList())  // [1, 2, 3, 4, 5]

区间代数[编辑 | 编辑源代码]

区间满足以下数学性质:

  • 自反性:a[a,b]
  • 传递性:abc[a,b][b,c]=[a,c]
  • 单调性:x[a,b]x+k[a+k,b+k]