我有两个清单:
List fruits = ['apples', 'bananas'];
List foods = ['apples', 'bananas'];
如何比较水果和食物,并确保两个列表的顺序相同?
答案 0 :(得分:3)
比较列表的相等性(而不是标识)的推荐方法是使用以下包中的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类,包括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.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
。