有没有一种方法可以使用zipWithNext kotlin压缩列表中的部分值?

时间:2019-01-27 07:21:48

标签: lambda kotlin

在Kotlin语言的官方文档中,有一个函数zipWithNext,如下所示。

val letters = listOf("a", "b", "c", "d", "e", "f")
val pairs = letters.zipWithNext {a, b -> a + b} // [ab, bc, cd, de, ef]

是否有一种方法可以仅汇总此列表的部分元素,而其余部分保持不变? 为了进行比较,您可以使用另一个listOf("bc", "de")。 在这种情况下,最终输出应类似于[a, bc, de, f]

1 个答案:

答案 0 :(得分:1)

我认为初始列表的大小是偶数,否则您将无法获得预期的结果。

对于

val letters = listOf("a", "b", "c", "d", "e", "f")

zipWithNext()

val pairs = (listOf("") + letters + listOf(""))
        .zipWithNext()
        .filterIndexed { index, _ -> index % 2 == 0 }
        .map { it.first + it.second }

chunked(2)

val pairs = listOf(letters.first()) + 
            letters.subList(1, letters.size - 1).chunked(2).map { it[0] + it[1] } + 
            listOf(letters.last())

都给出以下结果:

[a, bc, de, f]

修改
至于比较列表:

fun getNewList(list: List<String>, comparison: List<String>) : List<String> {
    val newList = mutableListOf<String>()
    var flag = false
    list.forEachIndexed { i, s ->
        if (i < list.size - 1) {
            if (!flag) {
                val item = s + list[i + 1]
                if (comparison.contains(item)) {
                    newList.add(item)
                    flag = true
                } else {
                    newList.add(s)
                }
            } else {
                flag = false
            }
        } else {
            newList.add(s)
        }
    }
    return newList
}

此代码:

val letters = listOf("a", "b", "c", "d", "e", "f")
val comparison = listOf("bc", "de")
val newList = getNewList(letters, comparison)
println(newList)

将打印:

[a, bc, de, f]