Kotlin聚合连续列表元素

gopyfrb3  于 2022-12-13  发布在  Kotlin
关注(0)|答案(1)|浏览(172)

我想对Kotlin列表中的连续数字求和。如果列表中有一个0,那么它应该从0之后的数字开始求和。结果将是一个求和列表。基本上求和直到第一个0,然后直到下一个0,依此类推。例如:

val arr = arrayOf(1, 2, 0, 2, 1, 3, 0, 4)
    // list of sums =  [3,        6,       4]

现在我用fold来运行它:

val sums: List<Int> = arr.fold(listOf(0)) { sums: List<Int>, n: Int ->
        if (n == 0)
            sums + n
        else
            sums.dropLast(1) + (sums.last() + n)
    }

但我想知道是否有一种更简单或更有效的方法来这样做。

gfttwv5a

gfttwv5a1#

我个人会这样写:

val sums = mutableListOf(0).also { acc ->
    arr.forEach { if (it == 0) acc.add(0) else acc[acc.lastIndex] += it }
  }

使用一个可变列表,你可以避免任何删除/连接操作,代码也更容易理解。
如果需要,您仍然可以使用.toList()将其转换为不可变列表。

相关问题