在Dart中,获取集合/列表中数字总和的最简单方法是什么?

109

我不喜欢无缘无故使用索引数组,只因为我认为它看起来很丑陋。是否有一种简洁的方式可以使用匿名函数进行求和?是否可能在不使用任何外部变量的情况下完成此操作?

14个回答

1
一个对我非常有效的解决方案是:
var total => [1,2,3,4].fold(0, (e, t) => e + t); // result 10

1
如果您计划在列表上执行多个数学运算,创建另一种包含 .sum() 和其他操作的列表类型可能会有所帮助,可以通过扩展 ListBase 来实现。其中一部分内容是受到此回答的启发,并结合了此回答的性能调整
import 'dart:collection';
import 'dart:core';

class Vector<num> extends ListBase<num> {
  
  List<num> _list;
  Vector() : _list = new List<num>();
  Vector.fromList(List<num> lst): _list = lst;
  
  void set length(int l) {
    this._list.length=l;
  }

  int get length => _list.length;
  
  num operator [](int index) => _list[index];

  void operator []=(int index, num value) {
    _list[index]=value;
  }
  // Though not strictly necessary, for performance reasons
  // you should implement add and addAll.

  void add(num value) => _list.add(value);

  void addAll(Iterable<num> all) => _list.addAll(all);
  
  num sum() => _list.fold(0.0, (a, b) => a + b) as num;
  /// add additional vector functions here like min, max, mean, factorial, normalize etc

}

并像这样使用它:
Vector vec1 = Vector();
vec1.add(1); 
print(vec1); // => [1]
vec1.addAll([2,3,4,5]); 
print(vec1); // => [1,2,3,4,5]
print(vec1.sum().toString()); // => 15
Vector vec = Vector.fromList([1.0,2.0,3.0,4.0,5.0]); // works for double too.
print(vec.sum().toString()); // => 15

0

寻找所有飞镖列表元素总和的不同方法:

方法1:使用循环: 这是最常用的方法。使用循环遍历列表,并将列表的所有元素添加到最终的总和变量中。我们在此处使用一个for循环:

main(List<String> args) {
  var sum = 0;
  var given_list = [1, 2, 3, 4, 5];

  for (var i = 0; i < given_list.length; i++) {
    sum += given_list[i];
  }

  print("Sum : ${sum}");
}

方法二:使用forEach: forEach是另一种迭代列表的方式。我们也可以使用这种方法来找出 dart 列表中所有值的总和。它与上述方法类似。唯一的区别是我们不必初始化另一个变量 i,也不需要 list.length。

main(List<String> args) {
  var sum = 0;
  var given_list = [1, 2, 3, 4, 5];

  given_list.forEach((e) => sum += e);

  print("Sum : ${sum}");
}

方法三:使用 reduce: reduce 方法使用给定的函数将列表的所有元素迭代地组合成一个单一的值。我们可以使用此方法来查找所有元素的总和,如下所示:

main(List<String> args) {
  var given_list = [1, 2, 3, 4, 5];

  var sum = given_list.reduce((value, element) => value + element);

  print("Sum : ${sum}");
}

方法四:使用 fold: fold() 类似于 reduce。它使用函数迭代地将列表的所有元素组合成一个单一的值。它需要一个初始值,并根据前一个值计算最终值。
main(List<String> args) {
  var sum = 0;
  var given_list = [1,2,3,4,5];

  sum = given_list.fold(0, (previous, current) => previous + current);

  print("Sum : ${sum}");
}

更多详情请参见:https://www.codevscolor.com/dart-find-sum-list-elements


-1
extension DoubleArithmeticExtensions on Iterable<double> {
  double get sum => length == 0 ? 0 : reduce((a, b) => a + b);
}

extension IntArithmeticExtensions on Iterable<int> {
  int get sum => length == 0 ? 0 :  reduce((a, b) => a + b);
}

使用方法:

final actual = lineChart.data.lineBarsData[0].spots.map((s) => s.x).sum;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接