如何在Kotlin中添加Array索引值?

时间:2018-01-28 09:19:44

标签: kotlin

首先,我在伴侣对象中创建空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集合)吗?

3 个答案:

答案 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内置了许多有用的扩展功能。先找他们。