我正在使用Dart比较两个列表,代码如下:
main() {
if ([1,2,3] == [1,2,3]) {
print("Equal");
} else {
print("Not equal");
}
}
但它们永远不相等。在Dart API中似乎没有equal()
方法来比较列表或集合。是否有适当的方法来做到这一点?
import 'package:collection/collection.dart';
编辑:在1.13之前,它是import 'package:collection/equality.dart';
例如:
Function eq = const ListEquality().equals;
print(eq([1,'two',3], [1,'two',3])); // => true
上面打印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 unOrdDeepEq = const DeepCollectionEquality.unordered().equals;
List list3 = [3, [[],'a'], 1];
print(unOrdDeepEq(list2, list3)); // => true
有关详细信息,请参见软件包API文档。像往常一样,要使用这样的软件包,您必须在pubspec.yaml
中列出它:
dependencies:
collection: any
对于使用Flutter的人来说,它有本地功能listEquals
,可以比较深度相等性。
import 'package:flutter/foundation.dart';
var list1 = <int>[1, 2, 3];
var list2 = <int>[1, 2, 3];
assert(listEquals(list1, list2) == true);
import 'package:flutter/foundation.dart';
var list1 = <int>[1, 2, 3];
var list2 = <int>[3, 2, 1];
assert(listEquals(list1, list2) == false);
因此,如果您正在寻找无限级别的相等性,请查看上面的“深度”一词是指相等性的第一级:如果元素是映射、列表、集或其他集合/复合对象,则这些元素的值不会逐个比较,除非它们的相等运算符(
Object.operator==
)这样做。
DeepCollectionEquality
,如Patrice Chalin所建议的那样。setEquals
和mapEquals
。Dart中的集合没有固有的相等性。即使两个集合包含完全相同的对象作为元素,它们也不相等。
collection库提供了定义这种相等性的方法。例如,在这种情况下:
IterableEquality().equals([1,2,3],[1,2,3])
如果两个列表包含完全相同的元素,那么这个等式就会认为它们完全相等。
collection
包。 - undefinedimport 'package:collection/equality.dart';
void main(List<String> args) {
if (const IterableEquality().equals([1,2,3],[1,2,3])) {
// if (const SetEquality().equals([1,2,3].toSet(),[1,2,3].toSet())) {
print("Equal");
} else {
print("Not equal");
}
}
更多信息 https://github.com/dart-lang/bleeding_edge/tree/master/dart/pkg/collection
void main() {
var a = [1,2,3];
var b = [1,3,2];
var condition1 = a.toSet().difference(b.toSet()).isEmpty;
var condition2 = a.length == b.length;
var isEqual = condition1 && condition2;
print(isEqual); // Will print true
}
虽然这个问题已经比较老了,但是在Dart中这个功能仍然没有被原生支持。我需要进行深度相等比较(List<List>
),所以我从上面借鉴了方法并进行了递归调用:
bool _listsAreEqual(list1, list2) {
var i=-1;
return list1.every((val) {
i++;
if(val is List && list2[i] is List) return _listsAreEqual(val,list2[i]);
else return list2[i] == val;
});
}
List<Map>
)时,仍然会失败 - 它只涵盖List<List<List>>
等内容。Built Collections 库为 Dart 提供了不可变的集合类型,包括相等性、哈希和其它好处。
如果你需要使用相等性,那么使用不可变性可能会更好。
class A {
final String name;
final List<int> list;
A(this.name, this.list);
}
class A extends Equatable {
final String name;
final List<int> list;
A(this.name, this.list);
@override
List<Object> get props => [name, list];
}
然后使用==
直接比较对象。
final x = A('foo', [1,2,3]);
final y = A('foo', [1,2,3]);
print(x == y); // true
props
getter的实现。也就是说,构造函数只需写成A(this.name, this.list);
,并添加一个带有@override
注解的List<Object> get props => [name, list];
方法。也许自你回答以来库已经发生了变化。 - swalog0.6.x
的需要进行我提到的更改。 - swalogextension on List {
bool equals(List list) {
if(this.length!=list.length) return false;
return this.every((item) => list.contains(item));
}
}
this
)中的每个item
是否包含在第二个列表(list
)中。但前提条件是两个列表长度相同。如果需要,你当然可以使用其他解决方案或修改此解决方案,我只是为了方便而展示这个方法。要使用此扩展程序,请执行以下操作:List list1, list2
list1.equals(list2);
[1,2,2,3].equals([1,3,3,2])
返回 true
。 - nipunasudha
false
。使用eq
和deepEq
都是如此。 - JeremyEquatable
以使其在DeepCollectionEquality
上工作。 - Anupdas