Kotlin中如何为Array设置索引值?能否像Java ArrayList那样使用?
你遇到的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

