In the list I need to replace each element with the sum of this element and all previous ones. The first element is not required to change. Example: The list (1.0, 2.0, 3.0, 4.0) must be converted (1.0, 3.0, 6.0, 10.0). I'm looking for the most concise and correct way.
I was googling for a long time and could not find any useful information regarding the conversion of an element by the sum of its previous ones. Also I could not find the required function in the standard library at Kotlinlang.org. Please help solve this problem.
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
}
You have to use a variable that stores the running sum.
fun accumulate(list: MutableList<Double>): MutableList<Double> {
var runningSum = 0.0
list.indices.forEach { i ->
runningSum += list[i]
list[i] = runningSum
}
return list
}
Note that an empty list is not a special case for this code.
If you'd prefer to do it the FP way and non-destructively transform the list, you can write this:
fun accumulate(list: List<Double>): List<Double> {
var runningSum = 0.0
return list.map {
runningSum += it
runningSum
}
}