kotlin 相关code

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] 赋值

相关推荐
我还记得那天10 小时前
函数的递归调用
c语言·开发语言·visualstudio
zhangfeng113310 小时前
ThinkPHP5 事件系统的标准最佳实践 事件系统的完整设计逻辑tags.php tags.php(事件地图)
android·开发语言·php
xyq202410 小时前
HTML 标签简写及全称
开发语言
tongluowan00710 小时前
数据结构 Bitmap(位图)示例 - 用户签到系统
开发语言·数据结构·bitmap·用户签到系统
就叫_这个吧10 小时前
Java线程池应用的四种方式+线程池底层实现原理
java·开发语言
Rust研习社10 小时前
Rust 官方拟定 LLM 政策,防止 LLM 污染开源社区?
开发语言·后端·ai·rust·开源
muqsen10 小时前
Java 分布式相关面试题总结
java·开发语言·分布式
fenglllle10 小时前
JDK8升级JDK17使用CompletableFuture在线程中classloader的变化
java·开发语言·jvm
froginwe1110 小时前
Scala 正则表达式
开发语言