String 每n个字符拆分一个字符串

String 每n个字符拆分一个字符串,string,split,kotlin,String,Split,Kotlin,将一个字符串拆分为两个字符的字符串的惯用方法是什么 示例: "" -> [""] "ab" -> ["ab"] "abcd" -> ["ab", "cd"] 我们可以假设字符串的长度是2的倍数 我可以使用类似于中的正则表达式,但我希望找到更好的方法(即使用kotlin的附加方法之一)。一旦kotlin 1.2发布,您可以使用提案中添加到kotlin stdlib的chunked函数。例如: val chunked = myString.chunked(2) 你已经可以试试这

将一个字符串拆分为两个字符的字符串的惯用方法是什么

示例:

"" -> [""]
"ab" -> ["ab"]
"abcd" -> ["ab", "cd"]
我们可以假设字符串的长度是2的倍数


我可以使用类似于中的正则表达式,但我希望找到更好的方法(即使用kotlin的附加方法之一)。

一旦kotlin 1.2发布,您可以使用提案中添加到
kotlin stdlib
chunked
函数。例如:

val chunked = myString.chunked(2)
你已经可以试试这个了


在此之前,您可以使用以下代码实现相同的功能:

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

此实现将删除小于
大小
元素的其余元素。您可以修改它,也可以将剩余部分添加到结果中。

功能版本的
chunked
使用:


如果原始字符串长度不是偶数,我认为实现中存在问题。@LiorBar问为什么?它只会删除剩下的部分。
println("abcdef".chunked(2)) // [ab, cd, ef]
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)
"".chunked(2) => []
"ab".chunked(2) => [ab]
"abcd".chunked(2) => [ab, cd]
"abc".chunked(2) => [ab, c]