1. 对比:indices vs withIndex()
| 需求 | 用 indices |
用 withIndex() |
|---|---|---|
| 需要索引+元素 | array[i] 多写一次 |
直接拿到两个变量 |
| 只读元素 | 不直观 | 直观 |
| 修改元素 | array[i] = xxx |
无法直接修改(解构后是副本) |
总结:如果只是读取索引和元素,withIndex() 更简洁;如果需要修改数组元素,还是得用 indices 或下标访问。
Kotlin
/**
*
*
* 快速对比
需求 推荐写法
只读元素 for (e in array)
读索引+元素 for ((i, e) in array.withIndex())
修改元素 for (i in array.indices) { array[i] = ... }
修改+需要索引 for (i in array.indices)
核心原则:在 Kotlin 中,只要想修改数组/列表元素,就必须通过下标 array[index] 赋值。
*
*/
fun main() {
val fruits = arrayOf("苹果", "香蕉", "橙子", "葡萄")
// ========== 基础用法 ==========
println("--- 基础用法 ---")
for ((index, element) in fruits.withIndex()) {
println("索引 $index 对应的水果是:$element")
}
for (i in fruits.indices) {
// 记住:字符串模板中,只要 $ 后面不是纯变量名(带点号 .、方括号 []、方法调用 () 等),就必须用 ${} 包裹。
println("索引 $i 对应的水果是:${fruits[i]}")
}
// ========== 实际场景 1:格式化编号列表 ==========
println("\n--- 格式化输出 ---")
for ((i, fruit) in fruits.withIndex()) {
println("${i + 1}. $fruit") // 从 1 开始编号
}
// ========== 实际场景 2:查找并替换特定位置的元素 ==========
println("\n--- 条件处理 ---")
for ((index, fruit) in fruits.withIndex()) {
if (index % 2 == 0) {
println("偶数索引 $index: $fruit (打五折)")
} else {
println("奇数索引 $index: $fruit (原价)")
}
}
// ========== 实际场景 3:与前一个元素比较 ==========
println("\n--- 相邻比较 ---")
for ((index, fruit) in fruits.withIndex()) {
if (index > 0) {
val prev = fruits[index - 1]
println("$fruit 紧跟在 $prev 后面")
} else {
println("$fruit 是第一个")
}
}
}
输出:
bash
--- 基础用法 ---
索引 0 对应的水果是:苹果
索引 1 对应的水果是:香蕉
索引 2 对应的水果是:橙子
索引 3 对应的水果是:葡萄
索引 0 对应的水果是:苹果
索引 1 对应的水果是:香蕉
索引 2 对应的水果是:橙子
索引 3 对应的水果是:葡萄
--- 格式化输出 ---
1. 苹果
2. 香蕉
3. 橙子
4. 葡萄
--- 条件处理 ---
偶数索引 0: 苹果 (打五折)
奇数索引 1: 香蕉 (原价)
偶数索引 2: 橙子 (打五折)
奇数索引 3: 葡萄 (原价)
--- 相邻比较 ---
苹果 是第一个
香蕉 紧跟在 苹果 后面
橙子 紧跟在 香蕉 后面
葡萄 紧跟在 橙子 后面
2.修改数组的正确写法
方式 1:用 indices(推荐,最清晰)
val array = arrayOf(10, 20, 30)
for (i in array.indices) {
array[i] = array[i] * 2 // ✅ 直接通过下标修改
}
// 结果: [20, 40, 60]
方式 2:用下标范围
for (i in 0 until array.size) {
array[i] += 1
}
方式 3:用 withIndex() 仅取索引,再回写
for ((index, _) in array.withIndex()) {
array[index] = array[index] * 2 // ✅ 也可以,但多此一举
}
快速对比
| 需求 | 推荐写法 |
|---|---|
| 只读元素 | for (e in array) |
| 读索引+元素 | for ((i, e) in array.withIndex()) |
| 修改元素 | for (i in array.indices) { array[i] = ... } |
| 修改+需要索引 | for (i in array.indices) |
核心原则 :在 Kotlin 中,只要想修改数组/列表元素,就必须通过下标 array[index] 赋值。