Kotlin:遍历列表并组合相同的项目

标签 kotlin reduce

我正在使用 Kotlin 编写 Android 应用程序。我有一个可变的字符串列表,我想遍历该列表以组合相同的字符串并显示它们以相同顺序出现的次数。 例如,

current list = [a,b,b,b,c,d,d,a,a,b,b,c]

我希望新列表看起来像这样:

new list = [a,(b) 3 times,c,(d) 2 times,(a) 2 times,(b) 2 times,c]

我知道我可以使用 for-each 循环来做到这一点,但我似乎想不出如何做,因为我是编程新手。如果有人能帮我解决这个问题,我将不胜感激!

最佳答案

这是一种方法。

结果可以存储为原始类型对(在您的情况下为 String,但我将其设为通用以便灵活)以计算其连续副本的数量。

创建一个 MutableList 来存储结果。创建一个变量来存储列表中最近检查的元素,并给出第一个元素的初始值。创建另一个变量,用于跟踪已找到的最新元素类型的数量。

然后我们迭代列表,从第二个索引开始(因为我们已经记录了第一个),对于每个索引,我们将其值与我们上次检查的值进行比较。如果相同,我们增加计数。如果不同,我们可以将最后检查的版本及其计数存储到输出列表中,并为新类型重置变量。

最后在返回之前将最后检查的值添加到输出列表。

fun <T> List<T>.consolidateConsecutive(): List<Pair<T, Int>> {
    if (size == 0) 
        return emptyList()
    val outList = mutableListOf<Pair<T, Int>>()
    var current = this[0]
    var currentCount = 1
    for (i in 1..lastIndex){
        val value = this[i]
        if (current == value) {
            currentCount++
        } else {
            outList.add(current to currentCount)
            current = value
            currentCount = 1
        }
    }
    outList.add(current to currentCount)
    return outList
}

用法:

fun main() {
    val list = listOf("a", "b", "b", "b", "c", "d", "d", "a", "a", "b", "b", "c")
    val consolidated = list.consolidateConsecutive()
    println(consolidated.joinToString())
}

打印

(a, 1), (b, 3), (c, 1), (d, 2), (a, 2), (b, 2), (c, 1)

关于Kotlin:遍历列表并组合相同的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61920402/

相关文章:

maven - 如何将 gradle 中的 groovy 任务转换为 Gradle Kotlin DSL 以生成 pom.xml?

python - 计算器 - 尝试从 'for' 中获取第一个数字并将其用作 INIT_VALUE

android - Kotlin:跳过协程

kotlin - 我需要哪个Kotlin下载?

asynchronous - Kotlin协程中的launch/join和async/await有什么区别

scala - 为什么reduceLeft的类型参数包含下界?

r - 在 R 中的贷款建模中应用 Reduce()

javascript - 执行一系列 Javascript promise ,一个接一个解决

hadoop - 在 map reduce 作业之间传递变量

java - Kotlin 扩展冲突