将每两个相等的元素合并到另一个

时间:2018-12-22 17:40:47

标签: kotlin functional-programming

如何将列表中每两个相等的元素合并为一个元素,合并过程由lambda函数指定。

例如,如果我有这样的列表

[“ a”,“ a”,“ b”,“ b”]

合并过程为{it.repeat(2)}

应该是这样的:

[“ aa”,“ bb”]

但是如果列表是这样的:

[“ a”,“ a”,“ a”]

应将其转换为

[“ aa”,“ a”]

另一个例子是:

[“ a”,“ b”,“ a”,“ b”]

将是

[“ a”,“ b”,“ a”,“ b”]

我尝试了zipWithNext(),但我不知道下一步该怎么做,尤其是当同一字母重复两次以上时。

如何使用Kotlin的功能编程方式在Kotlin中实现这种方式。

1 个答案:

答案 0 :(得分:1)

这是非常低效的解决方案,但理想解决方案。根据要求,我已尽可能使用functional programming。希望你会喜欢。但是,如果使用loopregular expression来解决此问题,将非常容易。 在这个问题中,不需要功能样式。

fun main(args: Array<String>) {
    val list = listOf("a", "a", "a", "a", "b", "b", "b", "b")
    //val list = listOf("a", "a", "a", "b", "a")
    var temp = false
    val result = list.zipWithNext().map {
        if (temp) {
            temp = false
            null
        } else {
            if (it.first == it.second) {
                temp = true
                it.first + it.second
            } else {
                it.first
            }
        }
    }.filter { !it.isNullOrBlank() }.toMutableList()
    if (!temp) {
        result.add(list.last())
    }

    print(result)
}