我有两个列表:
List fruits = ['apples', 'bananas'];
List foods = ['apples', 'bananas'];
我该如何比较水果和食品,并确保两个列表中的对象顺序相同?
我有两个列表:
List fruits = ['apples', 'bananas'];
List foods = ['apples', 'bananas'];
推荐比较列表是否相等(而不是相同)的方法是使用以下包中的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
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
。有几种方法可以实现这个目标,但这不一定是完整的列表。无论如何:
我提出的每个解决方案都需要先进行长度检查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);