首先,我在伴侣对象中创建空Array(Kotlin)实例。
companion object {
var strarray: Array<String> = arrayOf()
var objectarray: LinkedHashMap<Int, List<Any>> = LinkedHashMap<Int, List<Any>>()
}
我希望从CSV文件中读取textString时使用空数组实例。
fun csvFileToString():String {
val inputStream = File(Paths.get("").toAbsolutePath().toString()
.plus("/src/main/SampleCSVFile_2kb.csv")).inputStream()
val reader = inputStream.bufferedReader()
var iterator = reader.lineSequence().iterator()
var index:Int = 1;
while (iterator.hasNext()){
var lineText:String = iterator.next()
strarray.set(index, lineText)
index++
}
return ""
}
但是当我运行该源代码时
a.csvFileToString()
println(CsvParser.strarray)
发生异常
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
strarray.set(index, lineText) <<<<<<<<< because of this line
我可以使用Array(来自kotlin集合),如ArrayList(来自java集合)吗?
答案 0 :(得分:4)
Array
的大小是在创建时定义的,无法修改 - 在您的示例中,它等于0
。
如果您想使用动态尺寸创建Array
,请使用ArrayList
。
答案 1 :(得分:2)
您可以使用 +=
向数组添加新项目,例如:item += item
private var songs: Array<String> = arrayOf()
fun add(input: String) {
songs += input
}
答案 2 :(得分:1)
arrayOf
为您提供一个数组。即使在Java中,数组的长度也是固定的。
listOf
为您提供了一个不可变列表。您无法在此列表中添加或删除项目。
您要找的是mutableListOf<String>
。
在您当前的方法中,重用成员属性,不要忘记在每次使用之前清除列表。
您的代码可以进一步简化(和改进),如下所示:
out.clear()
inputStream.bufferedReader().use { reader -> // Use takes care of closing reader.
val lines = reader.lineSequence()
out.addAll(lines) // MutableList can add all from sequence.
}
现在想象你想要使用输出列表但需要同时解析另一个文件。
考虑使用纯函数(没有副作用,现在没有访问成员属性)并进一步简化它:
fun csvFileToString(): String { // Now method returns something useful.
val inputStream = File(Paths.get("").toAbsolutePath().toString()
.plus("/src/main/SampleCSVFile_2kb.csv")).inputStream()
inputStream.bufferedReader().use {
return it.lineSequence().joinToString("\n")
}
}
在这种情况下,我们可以完全跳过列表和数组,只需阅读文本:
inputStream.bufferedReader().use {
return it.readText()
}
我认为这首先是你想要的。
Kotlin内置了许多有用的扩展功能。先找他们。