Как вернуть несколько элементов из коллекции? - PullRequest
0 голосов
/ 13 января 2019

В списке мне нужно заменить каждый элемент суммой этого элемента и всех предыдущих. Первый элемент не требуется менять. Пример: список (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 голосов
/ 13 января 2019

Вы можете написать это проще, используя slice() и sum():

fun accumulate(list: MutableList<Double>) = list.mapIndexed { index, d -> list.slice(0..index).sum() }.toMutableList()
0 голосов
/ 13 января 2019

Вы должны использовать переменную, в которой хранится текущая сумма.

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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...