如何在Dart中比较两个列表是否相等且包含相同的对象?

8

我有两个列表:

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

我该如何比较水果和食品,并确保两个列表中的对象顺序相同?

可能是如何在Dart中比较列表的相等性?的重复问题。 - Günter Zöchbauer
3个回答

7

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

import 'package:collection/equality.dart';

E.g.,

Function eq = const ListEquality().equals;
print(eq(fruits, foods)); // => 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的相等性。您甚至可以对集合进行无序(深度)比较:

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

详细信息请参阅软件包API文档。通常情况下,要使用这种软件包,您必须在pubspec.yaml中列出它:

dependencies:
  collection: any

2

Flutter中有foundation.dart类的listEquals方法,用于比较列表。

import 'package:flutter/foundation.dart';

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

}

此外,setEqualsmapEquals可用于比较mapset

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);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接