Kotlin区间(Ranges)
外观
Kotlin区间(Ranges)[编辑 | 编辑源代码]
区间(Range)是Kotlin中表示一系列连续值的特殊结构,支持数字、字符等多种类型。区间通过操作符..
、until
、downTo
等实现,是控制流和集合操作的重要基础。
基础概念[编辑 | 编辑源代码]
区间表示数学中的闭区间或半开区间,包含以下核心特性:
- 包含边界:如
1..4
包含1,2,3,4 - 迭代能力:可用于循环遍历
- 包含检测:通过
in
操作符检查元素是否属于区间
数学表示[编辑 | 编辑源代码]
闭区间表示为:
半开区间表示为:
区间创建[编辑 | 编辑源代码]
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]
图形绘制范围[编辑 | 编辑源代码]
性能考虑[编辑 | 编辑源代码]
- 区间对象会缓存边界值,重复使用相同区间不会产生额外开销
- 对于大型区间(如
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
而非默认浮点类型
- 优先使用
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]
区间代数[编辑 | 编辑源代码]
区间满足以下数学性质:
- 自反性:
- 传递性:
- 单调性: