見た目が醜いと思う以外の理由で、インデックス付き配列を使用するのは好きではありません。匿名関数で合計するクリーンな方法はありますか?外部変数を使用せずにそれを行うことは可能ですか?
13 に答える
Dart iterablesにreduce関数(https://code.google.com/p/dart/issues/detail?id=1649)が追加されたため、独自のfold関数を定義せずに合計を簡単に行うことができます。
var sum = [1, 2, 3].reduce((a, b) => a + b);
int sum = [1, 2, 3].fold(0, (previous, current) => previous + current);
または、変数名を短くして、占有するスペースを減らします。
int sum = [1, 2, 3].fold(0, (p, c) => p + c);
これは非常に古い質問ですが
2021年には、実際には組み込みのパッケージがあります。
インポートするだけ
import 'package:collection/collection.dart';
.sum
のextensionメソッドを呼び出しますIterable
。
完全な例
import 'package:collection/collection.dart';
void main() {
final list = [1, 2, 3, 4];
final sum = list.sum;
print(sum); // prints 10
}
リストが空の場合は、を.sum
返します0
。
あなたも興味があるかもしれませんlist.average
...
私はまだこれがこの特定の問題のためによりきれいで理解しやすいと思います。
num sum = 0;
[1, 2, 3].forEach((num e){sum += e;});
print(sum);
また
num sum = 0;
for (num e in [1,2,3]) {
sum += e;
}
現在のようにコアライブラリを使用してそれを行うためのクリーンな方法はありませんが、独自のfoldLeftをロールする場合は、
main() {
var sum = foldLeft([1,2,3], 0, (val, entry) => val + entry);
print(sum);
}
Dynamic foldLeft(Collection collection, Dynamic val, func) {
collection.forEach((entry) => val = func(val, entry));
return val;
}
foldLeftをコアコレクションに追加することについてDartチームと話しましたが、すぐにそこにあることを願っています。
Dart 2.6以降では、拡張機能を使用して、リストにユーティリティメソッドを定義できます。これは、数値(例1)だけでなく、ジェネリックオブジェクト(例2)でも機能します。
extension ListUtils<T> on List<T> {
num sumBy(num f(T element)) {
num sum = 0;
for(var item in this) {
sum += f(item);
}
return sum;
}
}
例1(リスト内のすべての数値を合計):
var numbers = [1, 2, 3];
var sum = numbers.sumBy((number) => number);
例2(すべてのPoint.xフィールドを合計):
var points = [Point(1, 2), Point(3, 4)];
var sum = points.sumBy((point) => point.x);
この関数は、一般的なユーティリティファイルで作成することをお勧めします。
T sum<T extends num>(T lhs, T rhs) => lhs + rhs;
int、double、floatはnumクラスを拡張するため、その関数を使用して任意の数値を合計できます。
例えば、
List<int> a = [1,2,3];
int result = a.reduce(sum);
print(result); // result will be 6
これで私のアプローチを共有します:
void main() {
int value = sumTwo([1, 4, 3, 43]);
print(value);
}
int sumTwo(List < int > numbers) {
int sum = 0;
for (var i in numbers) {
sum = sum + i;
}
return sum;
}
リストに対していくつかの数学演算を実行することを計画している場合は、ListBaseを拡張して、.sum()やその他の演算を含む別のリストタイプを作成すると役立つ場合があります。この一部は、この応答からのパフォーマンスの微調整を伴うこの応答に触発されています。
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
foldを使用するときにdouble
TypeErrorが発生する場合は、reduceを使用できます。
var sum = [0.0, 4.5, 6.9].reduce((a, b) => a + b);
私にとってきれいに機能した解決策は次のとおりです。
var total => [1,2,3,4].fold(0, (e, t) => e + t); // result 10
すべてのダーツリスト要素の合計を見つけるさまざまな方法、
方法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}");
}
方法2:forEachの使用:forEachは、リストを反復処理するもう1つの方法です。この方法を使用して、ダーツリスト内のすべての値の合計を見つけることもできます。上記の方法と同様です。唯一の違いは、別の変数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}");
}
方法3:reduceの使用:reduceメソッドは、指定された関数を使用して、リストのすべての要素を1つの値に繰り返し結合します。このメソッドを使用して、次のようにすべての要素の合計を見つけることができます。
main(List<String> args) {
var given_list = [1, 2, 3, 4, 5];
var sum = given_list.reduce((value, element) => value + element);
print("Sum : ${sum}");
}
方法4:foldの使用:fold()はreduceに似ています。関数を使用して、リストのすべての要素を1つの値に繰り返し結合します。1つの初期値を取り、前の値に基づいて最終値を計算します。
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をご覧ください。
@tmaihoffの回答(collection.dartパッケージの使用について)にいくつかの小さな詳細を追加したいと思います。
sum
彼が話しているゲッターは、またはのような値の反復可能に対してのみ機能しnum
ます。List<int>
Set<double>
値を表す他のオブジェクトタイプ(、、、、またはその他)のリストがある場合は、Money
それを数値にマップする必要がありますDecimal
。Rational
たとえば、文字列のリスト内の文字数をカウントするには、次のようにします。
// Returns 15.
['a', 'ab', 'abc', 'abcd', 'abcde'].map((e) => e.length).sum;
2022年の時点で、それを行う別の方法は、 fast_immutable_collectionsパッケージのsumBy()
メソッドを使用することです。
// Returns 15.
['a', 'ab', 'abc', 'abcd', 'abcde'].sumBy((e) => e.length), 15);
注:私はパッケージの作成者です。