将csv字符串转换为Int的列表

时间:2018-02-24 17:34:36

标签: kotlin

我尝试使用this问题的答案将由,分隔的一串项目组合成Int列表,因此我创建了此代码:

fun main(args: Array<String>) {
    val regex = ","
    val lines = "30,21,29, 31, 40, 48, 53, 47, 37, 39, 31, 29, 17, 9, 20, 24, 27, 35, 41, 38, 27, 31, 27, 26, 21, 13, 21, 18, 33, 35, 40, 36, 22, 24, 21, 20, 17, 14, 17, 19, 26, 29, 40, 31, 20, 24, 18, 26, 17, 9, 17, 21, 28, 32, 46, 33, 23, 28, 22, 27, 18, 8, 17, 21, 31, 34, 44, 38, 31, 30, 26, 32"

    val series = lines.split(regex).toList().map{ it.toInt() }.toList<Int>()

    println(series)
}

但它没有用,我收到了这个错误:

  

线程“main”中的异常java.lang.NumberFormatException:用于输入   字符串:“31”       at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)       在java.lang.Integer.parseInt(Integer.java:569)       在java.lang.Integer.parseInt(Integer.java:615)       在Reading_many_names_from_the_command_lineKt.main(从命令行读取许多名称.kt:5)

3 个答案:

答案 0 :(得分:3)

当您只是,分开时,您将获得所有空格作为令牌的一部分。

一种解决方案是在转换为Int:

之前修剪字符串
val series: List<Int> = lines.split(regex).map{ it.trim().toInt() }

我也简化了你的表达,你不需要额外的List转换。

答案 1 :(得分:1)

java.lang.NumberFormatException: For input string: " 31"

错误就在你面前。 &#34; 31&#34;不是有效的数字。要解决此问题,您可以map{ it.trim().toInt() }代替map{ it.toInt() }

split()调用之后,您将获得一个字符串数组。要素是: &#34; 30&#34;,&#34; 21&#34;,&#34; 29&#34;,&#34; 31&#34;,&#34; 40&#34;前三个数字很好,之后它们有一个额外的空格字符。 &#34; 31&#34;无法转换为整数。

要删除空白区域,您可以使用trim()功能。

答案 2 :(得分:1)

,上拆分字符串会使空格保持不变。您可以在拆分后修剪所有字符串(如其他答案所示),或者您可以将字符串拆分为“逗号后跟(或前面)任意数量的空格”。为此,您需要更改要拆分的正则表达式。像这样:

val regex = "\\s*,\\s*".toRegex()
val series = lines.split(regex).map { it.toInt() }