在列表中,我需要用该元素和所有先前元素的总和替换每个元素。不需要更改第一个元素。 示例:列表(1.0、2.0、3.0、4.0)必须转换(1.0、3.0、6.0、10.0)。我正在寻找最简洁,最正确的方法。
我搜索了很长时间,无法找到任何有关将元素转换为先前元素之和的有用信息。另外,我在Kotlinlang.org的标准库中找不到所需的功能。请帮助解决此问题。
fun accumulate(list: MutableList<Double>): MutableList<Double> {
if (list.isEmpty()) return list
else for (i in 0 until list.size) {
if (i == list.indexOf(list.first())) list[i] = list.first()
else list[i] = list.sumByDouble { it } // here's my problem
}
return list
}
答案 0 :(得分:5)
您必须使用存储运行总和的变量。
fun accumulate(list: MutableList<Double>): MutableList<Double> {
var runningSum = 0.0
list.indices.forEach { i ->
runningSum += list[i]
list[i] = runningSum
}
return list
}
请注意,空列表并不是此代码的特殊情况。
如果您希望以FP方式进行操作并以无损方式转换列表,则可以这样编写:
fun accumulate(list: List<Double>): List<Double> {
var runningSum = 0.0
return list.map {
runningSum += it
runningSum
}
}
答案 1 :(得分:1)
您可以使用slice()
和sum()
来写得更简单:
fun accumulate(list: MutableList<Double>) = list.mapIndexed { index, d -> list.slice(0..index).sum() }.toMutableList()