Eman Essam
Eman Essam

Reputation: 162

convert string to list of int in kotlin

I have a string = "1337" and I want to convert it to a list of Int, I tried to get every element in the string and convert it to Int like this string[0].toInt but I didn't get the number I get the Ascii value, I can do it with this Character.getNumericValue(number), How I do it without using a built it function? with good complexity?

Upvotes: 3

Views: 1386

Answers (3)

Twistleton
Twistleton

Reputation: 2935

Maybe like this? No-digits are filtered out. The digits are then converted into integers:

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

Requires Kotlin 1.4.30 or higher and this option:

@OptIn(ExperimentalStdlibApi::class)

Upvotes: 0

O.Badr
O.Badr

Reputation: 3121

As in Java and by converting Char to Int you get the ascii equivalence.

You can instead:

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

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

Upvotes: 1

undermark5
undermark5

Reputation: 893

What do you mean "without using a built in function"?

string[0].toInt gives you the ASCII value of the character because the fun get(index: Int) on String has a return type of Char, and a Char behaves closer to a Number than a String. "0".toInt() == 0 will yield true, but '0'.toInt() == 0 will yield false. The difference being the first one is a string and the second is a character.

A oneliner

string.split("").filterNot { it.isBlank() }.map { it.toInt() }

Explanation: split("") will take the string and give you a list of every character as a string, however, it will give you an empty string at the beginning, which is why we have filterNot { it.isBlank() }, we then can use map to transform every string in our list to Int

If you want something less functional and more imperative that doesn't make use of functions to convert there is this

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
}

The reason why c - '0' works is because the ASCII values for the digits are all in numerical order starting with 0, and when we subtract one character from another, we get the difference between their ASCII values.

This will give you some funky results if you give it a string that doesn't have only digits in it, but it will not throw any exceptions.

Upvotes: 2

Related Questions