【发布时间】:2019-10-20 17:56:58
【问题描述】:
我试图通过将每个单独的元素加在一起并输出一个带有结果的最终列表来将 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
}
此解决方案有效,但难以阅读且不是很干净。我正在寻找更好的!
【问题讨论】:
标签: kotlin collections