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

相关推荐
IT WorryFree几秒前
Zabbix 7.4 API 可同步全量参数清单(同步第三方系统专用)
java·开发语言·zabbix
码云骑士11 分钟前
06-Python装饰器从入门到源码(上)-闭包与自由变量
开发语言·python
码云骑士20 分钟前
10-Python运行时内存模型-栈帧-堆-引用计数-GC分代回收的全景图
开发语言·python
智码看视界27 分钟前
老梁聊全栈系列 JavaScript语言本质:从原型链到异步编程的深度解析
开发语言·javascript·全栈·javascript核心
AI科技星30 分钟前
数术工坊・八卷全书【本源创世终极版・万世定稿】
开发语言·网络·量子计算·拓扑学
雾沉川32 分钟前
Visual C++ 运行库合集 v105.0 部署与故障排查技术指南
开发语言·c++·dll
码云骑士33 分钟前
02-Python可变对象与不可变对象(上)-赋值陷阱与函数传参的暗坑
开发语言·python
gaohe26AIliuzeyu42 分钟前
Java内部类
java·开发语言
AI科技星44 分钟前
数术工坊・八卷全书(番外・实战升华副卷)【终极典藏定稿|完整无删减】
c语言·开发语言·网络·量子计算·agi
丘山望岳1 小时前
剑起霜华——平衡二叉树(AVL树 )精讲
开发语言·数据结构·c++