普通、比較といったら「==」を使います。
ですが、Dartのリストの場合は、「==」だと正しい比較が出来ません。
リストを比較するにはどうしたらいいのでしょうか?
方法
Dartのリストを比較するには、比較するために用意された関数やクラスを使います。
リストの比較に使える関数やクラスは、次の3つです。
- listEquals関数:引数に指定した2つのリストを比較
- ListEqualityクラス:リスト比較用のクラス
- DeepCollectionEqualityクラス:コレクション(リストやマップなど)の細かい比較をするクラス
この3つのいずれかを使って、リストの比較は行います。
使い方

比較に使う関数とクラスの使い方を解説します。
listEquals関数
まず、必要ならば「foundation」パッケージをインポートします。
import 'package:flutter/foundation.dart';
次に、引数に比較したいリストを2つ指定します。
var list1 = <int>[1, 2, 3];
var list2 = <int>[1, 2, 3];
print(listEquals(list1, list2));

2つのリストが同じであれば「true」、そうでなければ「false」が返されます。
このように、引数に比較したいリストを指定するだけで、簡単に比較を行うことが出来ます。
ListEqualityクラス

まず、「collection」パッケージをインポートします。
import 'package:collection/collection.dart';
次に、listEqualityクラスのインスタンスを作ります。
var listEq = ListEquality().equals;
そして、作成したインスタンスに2つの引数を渡すことで、比較することが出来ます。
var listEq = ListEquality().equals;
var list1 = <int>[1, 2, 3];
var list2 = <int>[1, 2, 3];
print(listEq(list1, list2));

流れをまとめると、次のようになります。
- 「collection」パッケージのインポート
- ListEqualityクラスのインスタンスを作る
- 作成したインスタンスの引数に比較するリストを指定する
DeepCollectionEqualityクラス

まず、「collection」パッケージをインポートします。
import 'package:collection/collection.dart';
次に「DeepCollectionEqualityクラス」のインスタンスを作成します。
var deepEq = DeepCollectionEquality().equals;
そして、作成したインスタンスの引数に比較したいリストを指定します。
var deepEq = DeepCollectionEquality().equals;
var list1 = <int>[1, 2, 3];
var list2 = <int>[1, 2, 3];
print(deepEq(list1, list2));

流れをまとめると、次のようになります。
- 「collection」パッケージのインポート
- DeepCollectionEqualityクラスのインスタンスを作る
- 作成したインスタンスの引数に比較するリストを指定する
また、「DeepCollectionEqualityクラス」の強みは、順序関係なく要素を比較できることにあります。
もし、順序に関係なく要素だけを比較したいならば、次のようにします。
var deepEq = DeepCollectionEquality.unordered().equals;
var list1 = <int>[1, 2, 3];
var list2 = <int>[3, 2, 1];
print(deepEq(list1, list2));

「 DeepCollectionEquality.unordered().equals」のようにインスタンスの仕方を変えることで、順番に関係なく比較することが出来ます。
まとめ
リストを比較するには、「==」ではなく、比較用のクラスや関数を使います。
リストを比較することが出来るクラスや関数は次の3つです。
- listEquals関数:引数に指定した2つのリストを比較
- ListEqualityクラス:引数に指定した2つのリストを比較
- DeepCollectionEqualityクラス:コレクション(リストやマップなど)の細かい比較をするクラス
「listEquals関数」と「ListEqualityクラス」は、順序と要素が一致しているかを比較します。
そして、「DeepCollectionEqualityクラス」は、順序関係なく要素が一致しているかを比較することが出来ます。
コメント