【发布时间】:2013-10-31 18:00:19
【问题描述】:
我有两个列表:
List fruits = ['apples', 'bananas'];
List foods = ['apples', 'bananas'];
如何比较水果和食物并确保两个列表具有相同顺序的相同对象?
【问题讨论】:
标签: dart
我有两个列表:
List fruits = ['apples', 'bananas'];
List foods = ['apples', 'bananas'];
如何比较水果和食物并确保两个列表具有相同顺序的相同对象?
【问题讨论】:
标签: dart
比较列表是否相等(而不是同一性)的推荐方法是使用以下包中的 Equality 类
import 'package:collection/equality.dart';
例如,
Function eq = const ListEquality().equals;
print(eq(fruits, foods)); // => true
这适用于您的情况,因为fruits 和foods 包含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;
详情请参阅package API documentation。像往常一样,要使用这样的包,你必须在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。
【讨论】: