在 Dart 中从一个列表到另一个列表获取累积总和/运行总数的更好方法

问题描述

这就是我想做的,比我现在做的更好。

销售人员在统计他的销售额。每天输入他的数据并为我们提供如下列表:

List<int> weekOneDaily = [3,4,2,7,13,34,22];

我想从上面的列表中创建一个运行总列表,这样每一天都会作为自己的条目添加到下一个

List<int> cumulativeDaily = [3,9,16,29,63,85];

我目前正在成功地这样做:

List<int> dailySales = [2,23,18];
List<int> cumulativeSales =[];

/// Create cumulative list totals
void getCumulative(List<int> list) {
  cumulativeSales.add(list.first);
  for (var index in list) {
    (index == list.first)
        ? cumulativeSales.add(index)
        : cumulativeSales.add(cumulativeSales.last += index);
  }
  cumulativeSales.removeLast();
  print('CUMULATIVE: $cumulativeSales');
}

getCumulative(dailySales);

这有点奇怪,因为它提供了两个相同的最后一个元素,所以我需要删除最后一个并且需要预渲染第一个才能使其工作。

有人给我指出一个更简单、更简洁、更少黑客的解决方案吗?

请注意我不想这样做video

解决方法

我会正确地做这样的事情:

/// Create cumulative list totals
List<int> getCumulative(List<int> list) => list.fold(
    [],(sums,element) => sums..add(element + (sums.isEmpty ? 0 : sums.last)));

void main() {
  print(getCumulative([2,9,4,16,13,23,18])); // [2,11,15,31,44,67,85]
}

或者这个更具可读性:

/// Create cumulative list totals
List<int> getCumulative(List<int> list) {
  var sum = 0;
  return [for (final value in list) sum += value];
}

void main() {
  print(getCumulative([2,85]
}