Чистый способ чтения всех строк ввода в Kotlin - PullRequest
0 голосов
/ 02 декабря 2018

Распространенная закономерность при выполнении задач кодирования - читать много строк ввода.Предполагая, что вы не знаете заранее, сколько строк вы хотите прочитать до EOF (readLine возвращает null).

Также как предисловие, я не хочу полагаться на java.utils. *, Так как яЯ кодирую в KotlinNative, поэтому нет Сканера.

Я хотел бы, возможно, сделать что-то вроде

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?

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

generateSequence имеет свойство nice, которое оно выполнит, если внутренний генератор вернет значение NULL и примет только одну итерацию, поэтому следующий код может быть действительным:

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

Затем, как и ответ s1m0nw1 , вы можете использовать любой из доступных Sequence<String> методов, чтобы уточнить это в соответствии с вашими требованиями.

0 голосов
/ 02 декабря 2018

Полагаю, вы говорите о чтении из System.in здесь?Вы можете заставить эту работу работать с последовательностями:

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

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

Мы начинаем нашу последовательность с первого readLine (начального числа последовательности), а затем читаем следующую строку, пока не встретится null.Последовательность, возможно, бесконечна, поэтому мы просто возьмем первые пять входов в примере.Читайте о деталях на Sequence здесь .

...