You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中如何为Array设置索引值?能否像Java ArrayList那样使用?

问题分析与解决方案:ArrayIndexOutOfBoundsException 与 Kotlin Array vs 动态集合

你遇到的ArrayIndexOutOfBoundsException核心原因很明确:Kotlin的Array是固定长度的静态数组,和Java里的普通数组(比如String[])是一个性质,而不是像ArrayList那样的动态扩容集合。

你初始化的strarray: Array<String> = arrayOf()是一个长度为0的空数组,连索引0的位置都不存在,更别说索引1了,调用set(index, lineText)自然会抛出越界异常。

能不能像用Java ArrayList那样用Kotlin的Array?

答案是不行。Kotlin的Array设计初衷就是用于固定长度的元素存储,一旦创建就无法改变其长度;而Java的ArrayList(对应Kotlin的MutableList/ArrayList)是基于动态扩容机制的集合,支持随时添加、删除元素,两者的定位完全不同。

正确的解决方案

推荐直接改用Kotlin的MutableList(和Java ArrayList行为一致),这是最符合你需求的方案:

1. 修改伴生对象的集合定义

companion object {
    // 用MutableList替代固定长度的Array
    var strarray: MutableList<String> = mutableListOf()
    var objectarray: LinkedHashMap<Int, List<Any>> = LinkedHashMap()
}

2. 简化CSV读取逻辑

你可以直接利用Kotlin的扩展函数简化文件读取,同时避免手动迭代的繁琐,还能自动管理流资源:

fun csvFileToString(): String {
    val filePath = Paths.get("").toAbsolutePath().toString() + "/src/main/SampleCSVFile_2kb.csv"
    // 用use块自动关闭流,addAll直接批量添加所有行
    File(filePath).bufferedReader().use { reader ->
        strarray.addAll(reader.lineSequence())
    }
    return ""
}

(可选)如果一定要用Array

如果你确实需要使用Array类型,那么必须先确定元素的数量,再创建对应长度的数组。最简单的方式是先把所有行读到列表里,再转成数组:

fun csvFileToString(): String {
    val filePath = Paths.get("").toAbsolutePath().toString() + "/src/main/SampleCSVFile_2kb.csv"
    val lines = File(filePath).readLines()
    // 把列表转成固定长度的Array
    strarray = lines.toTypedArray()
    return ""
}

这种方式虽然能得到Array,但灵活性远不如MutableList,仅在你确定不需要动态修改元素数量时使用。

总结

在需要动态添加元素、不确定元素数量的场景下,优先选择MutableList或ArrayList,它们的使用体验和Java的ArrayList完全一致;只有当你明确知道元素数量固定时,Kotlin的Array才是合适的选择。

内容的提问来源于stack exchange,提问作者prepare123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:45:22