在 Kotlin 中读取所有输入行的简洁方法
Clean way of reading all input lines in Kotlin
进行编码挑战时的一个常见模式是阅读多行输入。假设你事先不知道有多少行,你想读到 EOF (readLine returns 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 循环的情况下将所有行读入数组?
我猜你是在谈论阅读 System.in 的内容?您可以使用序列来实现:
val lines = generateSequence(readLine()) {
readLine()
}
lines.take(5).forEach { println("read: $it") }
我们从第一个 readLine
(序列的种子)开始我们的序列,然后读取下一行直到遇到 null
。该序列可能是无限的,因此我们只采用示例中的前五个输入。阅读有关 Sequence
here.
的详细信息
generateSequence
有很好的 属性 如果内部生成器 returns null 并且只接受一次迭代,它将完成,所以下面的代码可能是有效的:
val input = generateSequence(::readLine)
val lines = input.toList()
然后像 一样,您可以使用任何可用的 Sequence<String>
方法根据您的解决方案的需要对其进行优化。
进行编码挑战时的一个常见模式是阅读多行输入。假设你事先不知道有多少行,你想读到 EOF (readLine returns 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 循环的情况下将所有行读入数组?
我猜你是在谈论阅读 System.in 的内容?您可以使用序列来实现:
val lines = generateSequence(readLine()) {
readLine()
}
lines.take(5).forEach { println("read: $it") }
我们从第一个 readLine
(序列的种子)开始我们的序列,然后读取下一行直到遇到 null
。该序列可能是无限的,因此我们只采用示例中的前五个输入。阅读有关 Sequence
here.
generateSequence
有很好的 属性 如果内部生成器 returns null 并且只接受一次迭代,它将完成,所以下面的代码可能是有效的:
val input = generateSequence(::readLine)
val lines = input.toList()
然后像 Sequence<String>
方法根据您的解决方案的需要对其进行优化。