Kotlin 通过对每个元素求和将 'N' 列表组合在一起

标签 kotlin collections

我试图通过将每个单独的元素相加并输出一个包含结果的最终列表来将 N 个列表组合在一起。这是一个可视化:

List 1: { 1, 2, 3 }
List 2: { 4, 5, 6 }
List 3: { 7, 8, 9 }
...
List N: { X, X, X }

如果我们组合前三个,输出将是:

List Result: { 12, 15, 18 }

我想继续对每个索引处的元素进行求和,以干净、内联的方式获得最佳性能。

我知道 zip 运算符在这里会有所帮助(很容易执行 list1.zip(list2) 并添加 pair.first 和 pair.second)但它不能处理多个列表。

我自学了 Kotlin 集合操作以尝试找到解决方案 - 我研究了使用 fold、reduce、flatMap、zip、groupBy,并可能将 List 转换为序列以利用每个元素方面的优势。但我似乎找不到一种干净的方法来将这些操作链接在一起以获得令人满意的结果。

附加信息:

我现在拥有的是一个名为 padStart(为简洁起见隐藏)的扩展方法,以帮助确保我所有的嵌套列表的长度相同,然后我笨拙地创建了一个临时列表,我在迭代时向其添加值:

myNestedLists
    .run {
        // Calculate largest list size of 'n' lists
        val largestSize = map { it.size }.max() ?: 0 
        // Pad lists with zeroes if size < largestSize
        map { it.padStart(largestSize, 0.0) }
    }
    .run {
        // Create temporary list, add all of the first elements to it
        val combinedList: MutableList<Double> = mutableListOf()

        combinedList.addAll(this.first())

        // Now, for each nested list, add each individual element with the combined value at combinedList[index]
        drop(1).forEach {
            it.forEachIndexed { index, value ->
                combinedList[index] += value
            }
        }

        // Return the final result
        combinedList
    }

此解决方案有效,但难以阅读且不太干净。我正在寻找更好的!

最佳答案

实用且直接:

lists.maxBy { it.size }!!.indices
     .map { index ->
        lists.mapNotNull { it.getOrNull(index) }.sum()
     }

如果您担心性能,编译器无论如何都会对其进行优化。

编辑:

如果列表的数量非常大或者值是由服务获取的,您可以在 map 操作中使用协程。

关于Kotlin 通过对每个元素求和将 'N' 列表组合在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58460672/

相关文章:

class - Kotlin 中的调用构造函数引用

generics - 语法 : multiple generic constraints and inheritance, 接口(interface)

android - 如何在 Android 应用程序中每天重复一个 Action ?

android - 如何重构具有 3 个相似方法的 onButtonClick?

java - java中的双向集合

c# - 如何在循环期间更改字典的值

java - 打乱整数测试的方法

java - 有没有办法在测试之间停止 micronaut 计划的工作?

java - 带有字符串键和值集<T>的映射

javascript - 在awaitReaction之后访问 react 集合node.js