2

进行编码挑战时的一个常见模式是读取多行输入。假设您事先不知道有多少行,您想读取直到 EOF(readLine 返回 null)。

另外作为前言,我不想依赖 java.utils.*,因为我在 KotlinNative 中编码,所以没有 Scanner。

我想做一些类似的事情

val lines = arrayListOf<String>()
for (var line = readLine(); line != null; line = readLine()) {
    lines.add(line)
}

但这显然不是有效的 Kotlin。我能想到的最干净的是:

while (true) {
    val line = readLine()
    if (line == null) break
    lines.add(line)
}

这行得通,但它似乎不是很地道。有没有更好的方法将所有行读入数组,而不使用 while/break 循环?

4

2 回答 2

9

generateSequence如果内部生成器返回 null 并且只接受一次迭代,它将完成的 nice 属性,因此以下代码可能是有效的:

val input = generateSequence(::readLine)
val lines = input.toList()

然后就像s1m0nw1 的回答一样,您可以使用任何可用的Sequence<String>方法来根据您的解决方案的需要来改进它。

于 2018-12-01T22:46:55.953 回答
3

我猜你是在谈论从 System.in 阅读?您可以使用序列来实现它:

val lines = generateSequence(readLine()) {
    readLine()
}

lines.take(5).forEach { println("read: $it") }

我们从第一个readLine(序列的种子)开始我们的序列,然后读取下一行,直到null遇到。该序列可能是无限的,因此我们只取示例中的前五个输入。Sequence 在此处阅读详细信息。

于 2018-12-01T21:55:53.930 回答