私はDartの2つのリストを次のように比較しています:
main() {
if ([1,2,3] == [1,2,3]) {
print("Equal");
} else {
print("Not equal");
}
}
しかし、それらは決して等しくはありません。 Dart APIには、リストやコレクションを比較するためのequal()メソッドがないようです。これを行う適切な方法はありますか?
ガンターの答えを完了するには:(同一性ではなく)リストの等価性を比較するための推奨される方法は、次のパッケージの等価性クラスを使用することです
_import 'package:collection/collection.Dart';
_
Edit:1.13より前は、 import 'package:collection/equality.Dart';
例えば。、
_Function eq = const ListEquality().equals;
print(eq([1,'two',3], [1,'two',3])); // => true
_
上記はtrue
を出力します。これは、対応するリスト要素がidentical()
であるためです。他のコレクションが含まれている可能性のあるリストを(詳細に)比較する場合は、代わりに次を使用します。
_Function deepEq = const DeepCollectionEquality().equals;
List list1 = [1, ['a',[]], 3];
List list2 = [1, ['a',[]], 3];
print( eq(list1, list2)); // => false
print(deepEq(list1, list2)); // => true
_
Map
sの等価性など、さまざまな方法で組み合わせることができる他の等価クラスがあります。コレクションのunordered(詳細)比較を実行することもできます。
_Function unOrdDeepEq = const DeepCollectionEquality.unordered().equals;
List list3 = [3, [[],'a'], 1];
print(unOrdDeepEq(list2, list3)); // => true
_
詳細は パッケージAPIドキュメント を参照してください。いつものように、そのようなパッケージを使用するには、それを_pubspec.yaml
_にリストする必要があります。
_dependencies:
collection: any
_
Flutterを使用している場合、ネイティブ関数 listEquals
があり、深い同等性を比較します。
var list1 = <int>[1, 2, 3];
var list2 = <int>[1, 2, 3];
assert(listEquals(list1, list2) == true);
var list1 = <int>[1, 2, 3];
var list2 = <int>[3, 2, 1];
assert(listEquals(list1, list2) == false);
Dartのコレクションには固有の同等性はありません。要素とまったく同じオブジェクトが含まれていても、2つのセットは等しくありません。
コレクションライブラリ は、そのような同等性を定義するメソッドを提供します。この場合、例えば
IterableEquality().equals([1,2,3],[1,2,3])
2つのリストが同じ要素を含んでいる場合、それらが完全に等しいと見なす等価です。
私はこれにつまずいた
import 'package:collection/equality.Dart';
void main(List<String> args) {
if (const IterableEquality().equals([1,2,3],[1,2,3])) {
// if (const SetEquality().equals([1,2,3].toSet(),[1,2,3].toSet())) {
print("Equal");
} else {
print("Not equal");
}
}
詳細情報 https://github.com/Dart-lang/bleeding_Edge/tree/master/Dart/pkg/collection
この質問はかなり古いですが、機能はまだダートにネイティブに搭載されていません。私は深い平等の比較が必要でした(List<List>
)、再帰呼び出しで上から借りました。
bool _listsAreEqual(list1, list2) {
var i=-1;
return list1.every((val) {
i++;
if(val is List && list2[i] is List) return _listsAreEqual(val,list2[i]);
else return list2[i] == val;
});
}
注:これは、コレクションタイプを混合する場合(つまり、List<Map>
)-List<List<List>>
等々。
これに関する最新のDartの問題は https://code.google.com/p/Dart/issues/detail?id=2217 (最終更新2013年5月)のようです。
Built Collectionsライブラリは、等価性、ハッシュ、その他の優れた機能を含むDartの不変のコレクションを提供します。
平等を必要とする何かをしているなら、あなたも不変性でより良くなる可能性があります。
このようなものはあなたのために働きますか?
try {
Expect.listEquals(list1, list2);
} catch (var e) {
print("lists aren't equal: $e");
}
例:
main() {
List<int> list1 = [1, 2, 3, 4, 5];
List<int> list2 = new List.from(list1);
try {
Expect.listEquals(list1, list2);
} catch (var e) {
print("lists aren't equal: $e");
}
list1.removeLast();
try {
Expect.listEquals(list1, list2);
} catch (var e) {
print("Lists aren't equal: $e");
}
}
2回目の印刷:
Lists aren't equal: Expect.listEquals(list length, expected: <4>, actual: <5>) fails
compareTo
関数を使用してリストを比較します。サードパーティのライブラリをインポートしたり listEquals
を使用せずに深い等価性をチェックすることも役立ちます:
List<List<int>> firstList = List.generate(9, (i) => List.generate(9, (j) => (9*i + j) )) ;
List<List<int>> secondList = List.generate(9, (i) => List.generate(9, (j) => (9*i + j) )) ;
bool compareLists( List<List<int>> one, List<List<int>> two){
return one.toString().compareTo(two.toString()) == 0 ;
}
print('Lists are ${compareLists(one, two) ? '' : 'not '} equal !');
動作する前に、これを使用できます:
/**
* Returns true if the two given lists are equal.
*/
bool _listsAreEqual(List one, List two) {
var i = -1;
return one.every((element) {
i++;
return two[i] == element;
});
}
リストフィールドを持つクラスがある場合、
class A {
final String name;
final List<int> list;
A(this.name, this.list);
}
そして、そのインスタンスを比較したい場合は、 equatable package を使用できます
class A extends Equatable {
final String name;
final List<int> list;
A(this.name, this.list) : super([name, list]);
}
そして、単に==
を使用してオブジェクトを比較します
final x = A('foo', [1,2,3]);
final y = A('foo', [1,2,3]);
print(x == y); // true