Как разбить строку без пробелов на массив целых чисел в Котлине? [дубликат]
этот вопрос уже есть ответ здесь:
- как преобразовать символ в Int? 3 ответы
Мне нужно разделить строку на массив целых чисел. Я попробовал:
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]