如何在Dart中将两个列表相等并包含相同的对象?

时间:2013-10-31 18:00:19

标签: dart

我有两个清单:

List fruits = ['apples', 'bananas'];
List foods = ['apples', 'bananas'];

如何比较水果和食物,并确保两个列表的顺序相同?

4 个答案:

答案 0 :(得分:3)

比较列表的相等性(而不是标识)的推荐方法是使用以下包中的Equality类

import 'package:collection/equality.dart';

如,

Function eq = const ListEquality().equals;
print(eq(fruits, foods)); // => true

这适用于您的情况,因为fruitsfoods包含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

还有其他可以通过多种方式组合的Equality类,包括Map的相等性。您甚至可以对集合执行无序(深层)比较:

Function deepEq = const DeepCollectionEquality.unordered().equals;

有关详细信息,请参阅package API documentation。像往常一样,要使用此类软件包,您必须在pubspec.yaml

中列出
dependencies:
  collection: any

答案 1 :(得分:2)

有几种方法可以实现这一点,但这不是一个完整的清单。但无论如何:

我提出的每一个解决方案都需要事先进行长度检查fruits.length == foods.length,所以我将其留空以保持简短。

显而易见的解决方案是迭代,但我想,这不是你想要的,否则你不会问这个问题:

var equals = true;
for (int i = 0; i < fruits.length; i++) {
  if (fruits[i] != foods[i]) {
    equals = false;
    break;
  }
}
print(equals);

另一种解决方案可能是使用fold

var index = 0;
equals = fruits.fold(true, (result, item) => result && item == foods[index++]);
print(equals);

这种方法的缺点是,即使存在不匹配,它也会继续迭代。

另一种可能性是使用firstWhere

var index = 0;
equals = fruits.firstWhere((item) => item != foods[index++], orElse: () => null) == null;
print(equals);

这种方法的缺点是空检查,因为这可能不是很明显,这是对相等性的检查,但是一旦找到第一个不匹配就会停止迭代。

答案 2 :(得分:0)

import 'package:queries/collections.dart';

void main() {
  var fruits = Collection(['apples', 'bananas']);
  var foods = Collection(['apples', 'bananas']);
  // Compare the sequences using default equality comparer if the compared
  // values are comparable
  var result = fruits.sequenceEqual(foods);
  print(result);
}

答案 3 :(得分:0)

Flutter 有 foundation.dartlistEquals 比较列表的方法

import 'package:flutter/foundation.dart';

void main() {
  List fruits = ['apples', 'bananas'];
  List foods = ['apples', 'bananas'];
  print(listEquals(fruits, foods)); // true

}

此外,setEqualsmapEquals 用于比较 mapset