我有两个清单:
List fruits = ['apples', 'bananas'];
List foods = ['apples', 'bananas'];
如何比较水果和食物并确保两个列表具有相同顺序的相同对象?
我有两个清单:
List fruits = ['apples', 'bananas'];
List foods = ['apples', 'bananas'];
如何比较水果和食物并确保两个列表具有相同顺序的相同对象?
比较列表是否相等(而不是身份)的推荐方法是使用以下包中的 Equality 类
import 'package:collection/equality.dart';
例如,
Function eq = const ListEquality().equals;
print(eq(fruits, foods)); // => true
这适用于您的情况,因为fruits
andfoods
包含相应的参数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
s 的相等性。您甚至可以对集合进行无序(深度)比较:
Function deepEq = const DeepCollectionEquality.unordered().equals;
有关详细信息,请参阅包 API 文档。像往常一样,要使用这样的包,你必须在你的pubspec.yaml
:
dependencies:
collection: any
有几种方法可以实现这一点,这肯定不是一个完整的列表。但无论如何:
我提出的每个解决方案都需要事先进行长度检查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);
这种方法的缺点是空值检查,因为它可能不是很明显这是一个相等性检查,但是一旦发现第一个不匹配它就会停止迭代。
Flutter 有比较列表的foundation.dart
类listEquals
方法
import 'package:flutter/foundation.dart';
void main() {
List fruits = ['apples', 'bananas'];
List foods = ['apples', 'bananas'];
print(listEquals(fruits, foods)); // true
}
还有setEquals
和mapEquals
有比较map
和set
。