如何从集合中返回多个元素?

时间:2019-01-13 09:48:23

标签: java kotlin

在列表中,我需要用该元素和所有先前元素的总和替换每个元素。不需要更改第一个元素。 示例:列表(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
}

2 个答案:

答案 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()