Как разбить строку без пробелов на массив целых чисел в Котлине? [дубликат]

этот вопрос уже есть ответ здесь:

Мне нужно разделить строку на массив целых чисел. Я попробовал:

val string = "1234567"
val numbers = string.split("").map { it.toInt() }
println(numbers.get(1))

но возникает следующее исключение:

исключение в потоке " main" Ява.ленг.NumberFormatException:
Для входной строки: "" в Ява.ленг.NumberFormatException.forInputString (NumberFormatException.Ява:65) на Яве.ленг.Целое число.parseInt(целое число.java: 592) at Ява.ленг.Целое число.parseInt(целое число.java: 615) at сеть.projecteuler.Problem_008Kt.main (Problem_008.kt: 54)

Как преобразовать строку "123456" в массив [1,2,3,4,5,6]?

3 ответов


код split("") подход [, 1, 2, 3, 4, 5, 6, 7, ], т. е. первый и последний элемент не может быть отформатирован в число.

на самом деле CharSequence.map все, что вам нужно:

val numbers = string.map { it.toString().toInt() } //[1, 2, 3, 4, 5, 6, 7]

С помощью этого кода, одиночные символы String преобразуются в соответствующие Int представление. Это приводит к List<Int>, который может быть преобразован в массив, как это:

string.map { it.toString().toInt() }.toIntArray()

вам просто не нужно split, но вы также не должны называть toInt() на символе напрямую; это даст вам его значение Unicode как целое число. Вам нужно Character.getNumericValue():

val string = "1234567"
val digits = string.map(Character::getNumericValue).toIntArray()
println(digits[1])

он печатает 2.


Как уже говорилось, достаточно использовать карту. Я просто хочу добавить, что вы должны рассмотреть случай, когда ваша строка содержит не только числа.

эта функция расширения позаботится об этом:

fun String.toSingleDigitList() = map {
    "$it".toIntOrNull()
}.filterNotNull()

использование:

val digits = "31w4159".toSingleDigitList()

результат:

[3, 1, 4, 1, 5, 9]