【问题标题】:How to chunk a list in specific value? [Kotlin]如何以特定值分块列表? [科特林]
【发布时间】:2021-05-09 06:37:15
【问题描述】:

如何按特定值对列表进行分块?

例如:当前值为 5 的分割

val x = listOf(1,2,3,4,5,2,3,1,5,4,1,5)

将 x 转换为:

x => [[1,2,3,4,5],[2,3,1,5],[4,1,5]]

【问题讨论】:

  • 您想将列表拆分为恰好包含 5 个项目的块,还是要将其拆分为每个块中的最后一个项目是 5? (不幸的是,您的示例是两者都给出相同结果的罕见情况之一。)
  • 第二种情况,我想在特定的“5”值处分块

标签: list kotlin chunked windowed


【解决方案1】:

令人惊讶的是,标准库中没有一种方法可以做到这一点。不过自己写一个也不难,例如:

/**
 * Splits a collection into sublists, following each occurrence of the given separator.
 */
fun <T> Collection<T>.splitAfter(separator: T): List<List<T>> {
    val result = mutableListOf<MutableList<T>>()
    
    var newSublist = true
    for (item in this) {
        if (newSublist)
            result += mutableListOf<T>()
        result.last() += item
        newSublist = (item == separator)
    }
    
    return result
}

按要求进行:

val x = listOf(1, 2, 3, 4, 5, 2, 3, 1, 5, 4, 1, 5)
println(x.splitAfter(5)) // prints [[1, 2, 3, 4, 5], [2, 3, 1, 5], [4, 1, 5]]

它还处理所有极端情况:空列表、连续分隔符以及零个或多个前导和/或尾随分隔符,例如:

val x = listOf(5, 5, 4, 5, 5, 2)
println(x.splitAfter(5)) // prints [[5], [5], [4, 5], [5], [2]]

(当然,包含涵盖所有此类情况的单元测试是个好主意。)

【讨论】:

    猜你喜欢
    • 2022-12-02
    • 2021-05-11
    • 1970-01-01
    • 2020-06-18
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    相关资源
    最近更新 更多