Split string every n characters

2019-01-27 20:24发布

问题:

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).

回答1:

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.



回答2:

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]