114 votes

Quelle est la façon la plus propre d'obtenir la somme des nombres dans une collection / liste en Dart ?

Je n'aime pas utiliser un tableau indexé pour aucune raison autre que je trouve ça moche. Y a-t-il un moyen propre de faire la somme avec une fonction anonyme ? Est-il possible de le faire sans utiliser de variables extérieures ?

1voto

Ryan Deschamps Points 40

Si vous prévoyez d'effectuer un certain nombre d'opérations mathématiques sur votre liste, il peut être utile de créer un autre type de liste qui inclut .sum() et d'autres opérations en étendant ListBase. Certaines parties de ceci sont inspirées par cette réponse avec des améliorations de performances provenant de cette réponse.

import 'dart:collection';
import 'dart:core';

class Vector extends ListBase {

  List _list;
  Vector() : _list = new List();
  Vector.fromList(List 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;
  }
  // Bien que ce ne soit pas strictement nécessaire, pour des raisons de performances
  // vous devriez implémenter add et addAll.

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

  void addAll(Iterable all) => _list.addAll(all);

  num sum() => _list.fold(0.0, (a, b) => a + b) as num;
  /// ajoutez ici d'autres fonctions de vecteur supplémentaires comme min, max, mean, factorial, normalize, etc.

}

Et l'utiliser comme ceci:

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]); // fonctionne également pour les nombres décimaux.
print(vec.sum().toString()); // => 15

1voto

user3557834 Points 1

Une solution qui a bien fonctionné pour moi est :

var total => [1,2,3,4].fold(0, (e, t) => e + t); // résultat 10

0voto

Suresh B B Points 41

Différentes façons de trouver la somme de tous les éléments de la liste de fléchettes,

Méthode 1: Utilisation d'une boucle : C'est la méthode la plus couramment utilisée. Parcourez la liste à l'aide d'une boucle et ajoutez tous les éléments de la liste à une variable de somme finale. Nous utilisons une boucle for ici :

main(List 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("Somme : ${sum}");
}

Méthode 2: Utilisation de forEach : forEach est une autre façon de parcourir une liste. Nous pouvons également utiliser cette méthode pour trouver la somme totale de toutes les valeurs d'une liste de fléchettes. C'est similaire à la méthode ci-dessus. La seule différence est que nous n'avons pas besoin d'initialiser une autre variable i et list.length n'est pas nécessaire.

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

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

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

Méthode 3: Utilisation de reduce : La méthode reduce combine tous les éléments d'une liste de manière itérative en une seule valeur à l'aide d'une fonction donnée. Nous pouvons utiliser cette méthode pour trouver la somme de tous les éléments comme ci-dessous :

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

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

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

Méthode 4: Utilisation de fold : fold() est similaire à reduce. Il combine tous les éléments d'une liste de manière itérative en une seule valeur à l'aide d'une fonction. Il prend une valeur initiale et calcule la valeur finale en fonction de la valeur précédente.

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

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

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

Pour plus de détails: https://www.codevscolor.com/dart-find-sum-list-elements

-1voto

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

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

Utilisation :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X