Глиф Учебники

Как считать несколько чисел из одной строки

Справочник · Kotlin · 1 минута чтения

Два числа в одной строке, например 3 5:

Kotlin
fun main() {
    val (a, b) = readln().split(" ").map { it.toInt() }
    println(a + b)
}
Ввод
3 5
Вывод
8

split(" ") делит строку по пробелу на части, map { it.toInt() } переводит каждую часть в число, а val (a, b) раскладывает первые два числа по переменным. Так же читаются три числа — val (a, b, c) — и до пяти: дальше раскладка не работает, берите список.

Список чисел

Частый формат задач: в первой строке — количество, во второй — сами числа:

Kotlin
fun main() {
    val n = readln().toInt()
    val numbers = readln().split(" ").map { it.toInt() }
    println("Count: $n")
    println("Sum: ${numbers.sum()}")
    println("Max: ${numbers.max()}")
}
Ввод
5
3 9 -2 7 4
Вывод
Count: 5
Sum: 21
Max: 9

numbers — список List<Int>, с ним работают все функции списков: sum(), max(), sorted(), filter.

Лишние пробелы

Если между числами два пробела или пробел в конце строки, split(" ") даст пустую строку, и toInt() на ней упадёт с ошибкой NumberFormatException: For input string: "". Надёжнее отбросить пустые части:

Kotlin
fun main() {
    val numbers = readln().split(" ").filter { it.isNotEmpty() }.map { it.toInt() }
    println(numbers)
}
Ввод
  10   20 30
Вывод
[10, 20, 30]

То же можно записать через регулярное выражение «один или несколько пробельных символов»: readln().trim().split(Regex("\\s+")).map { it.toInt() }.

Числа на отдельных строках

Если каждое число — на своей строке, а их количество дано первым:

Kotlin
fun main() {
    val n = readln().toInt()
    val numbers = List(n) { readln().toInt() }
    println(numbers)
}
Ввод
3
10
20
30
Вывод
[10, 20, 30]

List(n) { ... } создаёт список из n элементов, вычисляя каждый блоком в фигурных скобках — здесь читая очередную строку.

До конца ввода

Если количество заранее неизвестно, читайте, пока строки не кончатся. readlnOrNull() возвращает null, когда ввод закончился:

Kotlin
fun main() {
    var sum = 0
    while (true) {
        val line = readlnOrNull() ?: break
        sum += line.toInt()
    }
    println(sum)
}
Ввод
1
2
3
Вывод
6

Обычный readln() в конце ввода не возвращает null, а бросает ошибку — поэтому здесь нужен readlnOrNull(). При вводе с клавиатуры конец ввода — Ctrl+D в Linux и macOS, Ctrl+Z и Enter в Windows.

Дробные числа

То же самое с toDouble(): readln().split(" ").map { it.toDouble() }. Дробная часть — через точку: 2.5. Строка 2,5 вызовет ошибку — о переводе строк в числа подробно в справке Как перевести строку в число.