在 Kotlin 中将字符串转换为整数列表

3

我有一个字符串 = "1337",我想将其转换为Int列表,我尝试获取字符串中的每个元素并将其转换为Int,例如 string[0].toInt,但是我得到的不是数字,而是Ascii值。我可以使用 Character.getNumericValue(number) 来实现,但如何在不使用内置函数的情况下以较好的复杂度实现?

3个回答

2
你的意思是“不使用内置函数”是什么意思?
因为String上的get(index: Int)函数返回类型为Char,而Char的行为更接近于Number而不是String,所以string[0].toInt会给你字符的ASCII值。"0".toInt() == 0将返回true,但'0'.toInt() == 0将返回false。区别在于第一个是字符串,第二个是字符。
这是一行代码。
string.split("").filterNot { it.isBlank() }.map { it.toInt() }

解释: split("")会将字符串拆分成每个字符的字符串列表,但它会在开头给你一个空字符串,这就是为什么我们有filterNot { it.isBlank() },然后我们可以使用map将列表中的每个字符串转换为Int

如果你想要一些更少使用函数进行转换的命令式代码,可以使用以下方式:

val ints = mutableListOf<Int>()       //make a list to store the values in
for (c: Char in "1234") {             //go through all of the characters in the string
    val numericValue = c - '0'        //subtract the character '0' from the character we are looking at
    ints.add(numericValue)            //add the Int to the list
}
< p> c -'0' 可以生效的原因是数字的ASCII值按照从0开始的数字顺序排列,当我们将一个字符从另一个字符中减去时,我们得到它们之间的ASCII值的差。

如果您提供的字符串不仅包含数字,则结果可能会有些奇怪,但不会抛出任何异常。


我猜 .split("") 是多余的,因为String已经实现了 CharSequence - Animesh Sahu
@AnimeshSahu 是的,因为String实现了CharSequence接口,所以split方法严格来说是不必要的,但它会返回一个字符串列表,而使用CharSequence方法将返回一个字符列表。考虑到digitToInt方法仍处于实验阶段(尽管我相信它很稳定,只是不能保证一直存在),我更愿意留在字符串领域。正如您从各种答案中看到的,解决这个问题有很多方法。 - undermark5

1

在Java中可以通过将Char转换为Int获得对应的ASCII码

而你也可以选择:

val values = "1337".map { it.toString().toInt() }

println(values[0]) // 1 
println(values[1]) // 3
// ...

1
从 Kotlin 1.5 开始,引入了 Char.digitToInt() - Animesh Sahu
@AnimeshSahu 感谢您指出,只是要提一下 Char.digitToInt() 仍处于实验阶段。 - O.Badr

0

可能像这样?非数字被过滤掉。然后将数字转换为整数:

val string = "1337"
  
val xs = string.filter{ it.isDigit() }.map{ it.digitToInt() }

需要使用Kotlin 1.4.30或更高版本以及此选项:

@OptIn(ExperimentalStdlibApi::class)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接