每n个字符分割字符串

19

有什么习惯用法可以将一个字符串拆分为每个字符串包含两个字符?

例如:

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

我们可以假设这个字符串的长度是2的倍数。

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

2个回答

51

一旦Kotlin 1.2发布,您可以使用已添加到kotlin-stdlib中的chunked函数,该函数是由KEEP-11提案添加的。例如:

val chunked = myString.chunked(2)

您可以使用 Kotlin 1.2 M2 预发布版 尝试此功能。


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

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]

此实现会丢弃少于 size 元素的余数。您可以修改它,以便将余数添加到结果中。

该实现删除小于 size 的余数,您可以修改它以使余数也被添加到结果中。


我认为实现存在问题,如果原始字符串长度不是偶数。 - Lior Bar-On
@LiorBar-On 为什么?它只会丢弃余数。 - hotkey

2
使用 generateSequence 实现的 chunked 函数的功能版本:
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]

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