8

我有两个清单:

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

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

4

3 回答 3

7

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

import 'package:collection/equality.dart';

例如,

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

这适用于您的情况,因为fruitsandfoods包含相应的参数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 类可以通过多种方式组合,包括Maps 的相等性。您甚至可以对集合进行无序(深度)比较:

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

有关详细信息,请参阅包 API 文档。像往常一样,要使用这样的包,你必须在你的pubspec.yaml

dependencies:
  collection: any
于 2014-03-11T17:54:04.860 回答
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);

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

于 2013-11-01T08:28:41.673 回答
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

于 2021-06-12T12:34:01.237 回答