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

相关推荐
死磕音视频5 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
顽疲8 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog8 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
程序喵大人10 小时前
【C++入门】编译链接模型 - 07 链接器怎样把符号对上号
开发语言·c++·编译器·编译链接·链接器
微三云 - 廖会灵 (私域系统开发)10 小时前
供应链系统实战:多渠道订单聚合与分布式库存一致性方案总结
开发语言·分布式·php
学逆向的10 小时前
C 数据溢出与精度丢失
c语言·开发语言·网络安全
霸道流氓气质11 小时前
AgentFlow 入门与实战:Task-Based 并发、EWMA 动态调度与四道门禁的 Java 生产级编排
java·开发语言
释厄62311 小时前
错误无误公理——错误正确本同源都迭代定律——逆转有价值
android·开发语言·kotlin
2601_9628857212 小时前
如何用 Python计算 CR能量指标(中间意愿指标)?
开发语言·python
临床数据科学和人工智能兴趣组12 小时前
在R语言的生态系统中,字符串处理一直是一个重要且复杂的任务
开发语言·正则表达式·r语言·r语言-4.2.1