Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Split string every n characters

What would be an idiomatic way to split a string into strings of 2 characters each?

Examples:

"" -> [""]
"ab" -> ["ab"]
"abcd" -> ["ab", "cd"]

We can assume that the string has a length which is a multiple of 2.

I could use a regex like in this Java answer but I was hoping to find a better way (i.e. using one of kotlin's additional methods).

like image 526
assylias Avatar asked Aug 13 '17 11:08

assylias


2 Answers

Once Kotlin 1.2 is released, you can use the chunked function that is added to kotlin-stdlib by the KEEP-11 proposal. Example:

val chunked = myString.chunked(2)

You can already try this with Kotlin 1.2 M2 pre-release.


Until then, you can implement the same with this code:

fun String.chunked(size: Int): List<String> {
    val nChunks = length / size
    return (0 until nChunks).map { substring(it * size, (it + 1) * size) }
}

println("abcdef".chunked(2)) // [ab, cd, ef]

This implementation drops the remainder that is less than size elements. You can modify it do add the remainder to the result as well.

like image 196
hotkey Avatar answered Oct 17 '22 23:10

hotkey


A functional version of chunked using generateSequence:

fun String.split(n: Int) = Pair(this.drop(n), this.take(n))
fun String.chunked(n: Int): Sequence<String> =
        generateSequence(this.split(n), {
            when {
                it.first.isEmpty() -> null
                else -> it.first.split(n)
            }
        })
                .map(Pair<*, String>::second)

Output:

"".chunked(2) => []
"ab".chunked(2) => [ab]
"abcd".chunked(2) => [ab, cd]
"abc".chunked(2) => [ab, c]
like image 37
Abhijit Sarkar Avatar answered Oct 17 '22 22:10

Abhijit Sarkar