【问题标题】:Split string every n characters每 n 个字符拆分字符串
【发布时间】:2017-08-13 11:37:15
【问题描述】:

将字符串拆分为每个字符串 2 个字符的惯用方法是什么?

例子:

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

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

我可以使用this Java answer 中的正则表达式,但我希望找到更好的方法(即使用 kotlin 的其他方法之一)。

【问题讨论】:

    标签: string split kotlin


    【解决方案1】:

    Kotlin 1.2 发布后,您可以使用 KEEP-11 提案添加到 kotlin-stdlibchunked 函数。示例:

    val chunked = myString.chunked(2)
    

    您已经可以使用Kotlin 1.2 M2 pre-release 尝试此操作。


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

    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 元素的余数。您可以修改它,也可以将剩余部分添加到结果中。

    【讨论】:

    • 我认为是实现有问题,如果原字符串长度不均匀。
    • @LiorBar-On 为什么?它只会丢弃剩余的部分。
    【解决方案2】:

    使用generateSequencechunked 的功能版本:

    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]
    

    【讨论】:

      猜你喜欢
      • 2012-03-17
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 2019-11-01
      相关资源
      最近更新 更多