如何从多行读取字符串并分别打印出来?

问题描述

class MusicPlayer {
    private var songs: Array<String> = arrayOf("")    
    var index = songs.size

    fun add(track: String) {
        songs[index-1] = track
    }
    fun show() {
        for (item in songs) {
            println(item)
        }
    }
}

fun main(args: Array<String>) {
    val m = MusicPlayer()
    
    while(true) {
        var input = readLine()!!
        if(input == "stop") {
            break
        }
        m.add(input)
    }
    m.show()
}

我的输入是

>Purple Haze
>Under Pressure
>Walk This Way
>stop

预期输出

>Purple Haze
>Under Pressure
>Walk This Way
>Playing Purple Haze

但我得到的是

线程“main”中的异常 java.lang.Arrayindexoutofboundsexception: 索引 -1 超出长度 0 的边界

解决方法

如果您使用可变列表,则不需要索引变量。使用可变列表比使用数组容易得多。

class MusicPlayer {

    private val songs = mutableListOf<String>()

    fun add(track: String) {
        songs.add(track)
    }
    fun show() {
        for (item in songs) {
            println(item)
        }
    }
}
,

MusicPlayer 类中的add 函数没有意义。首先,想象前三个迭代。我们调用了 3 次 add 方法,就像这样:

m.add("song1")
m.add("song2")
m.add("song3")

在 MusicPlayer 中,它将如下所示: (您没有在任何地方修改“index”变量,所以...)

// index = 1
// songs[index - 1] = songs[1 - 1] = songs[0]

//first add
songs[0] = "song1"

//second add
songs[0] = "song2"

//third add
songs[0] = "song3"

其次,数组的大小不是动态的。如果你声明一个 size = 1 的数组,它的大小将永远是 1。你不能做这样的事情
private var songs: Array<Stirng> = arrayOf("")
songs[2] = "exampleText" //ArrayIndexOutOfBoundsException

数组仅为 1 个元素保留内存。有办法处理它,但在您的示例中,我建议您使用 ArraysList 或 MutableList(几乎相同)。此类集合允许您自由修改其大小/长度。

带有 ArrayList 的 MusicPlayer 看起来像这样

    private var songs: ArrayList<String> = ArrayList()

    fun add(track: String) {
        songs.add(track)
    }
    fun show() {
        for (item in songs) {
            println(item)
        }
    }