如何在Dart中比较列表中的相等性?

Mar*_*k B 32 dart

我正在比较Dart中的两个列表:

main() {
    if ([1,2,3] == [1,2,3]) {
        print("Equal");
    } else {
        print("Not equal");
    }   
}
Run Code Online (Sandbox Code Playgroud)

但他们永远不会平等.Dart API中似乎没有equ()方法来比较列表或集合.有没有正确的方法来做到这一点?

Pat*_*lin 49

要完成Gunter的答案:比较列表是否相等(而不是标识)的推荐方法是使用以下包中的Equality类

import 'package:collection/collection.dart';
Run Code Online (Sandbox Code Playgroud)

编辑:在1.13之前,它是import'package:collection/equality.dart';

例如,

Function eq = const ListEquality().equals;
print(eq([1,'two',3], [1,'two',3])); // => true
Run Code Online (Sandbox Code Playgroud)

以上打印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
Run Code Online (Sandbox Code Playgroud)

还有其他可以通过多种方式组合的Equality类,包括Maps的相等性.您甚至可以执行集合的无序(深度)比较:

Function unOrdDeepEq = const DeepCollectionEquality.unordered().equals;
List list3 = [3, [[],'a'], 1];
print(unOrdDeepEq(list2, list3)); // => true
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅包API文档.像往常一样,要使用这样的包,你必须在你的列表中列出pubspec.yaml:

dependencies:
  collection: any
Run Code Online (Sandbox Code Playgroud)

  • 似乎不适用于对象列表。我有一个对象列表,即使它们匹配,我也会得到“false”。两者都带有“eq”和“deepEq”。 (5认同)

Hug*_*sos 22

对于使用Flutter的用户,它具有本机功能listEquals,可以比较深度相等。

var list1 = <int>[1, 2, 3];
var list2 = <int>[1, 2, 3];

assert(listEquals(list1, list2) == true);
Run Code Online (Sandbox Code Playgroud)
var list1 = <int>[1, 2, 3];
var list2 = <int>[3, 2, 1];

assert(listEquals(list1, list2) == false);
Run Code Online (Sandbox Code Playgroud)


小智 11

您现在可以使用内置的 listEquals、setEquals 和 mapEquals 函数来检查是否相等。

这是文档的链接:https ://api.flutter.dev/flutter/foundation/listEquals.html

  • 这些适用于 Flutter,在纯 Dart 中不可用。对于 Dart,您可以使用“collection”包。 (2认同)

Adr*_*uri 10

在 Dart 中比较两个 int 列表的相等性的一个简单解决方案是使用 Sets (不检查列表中元素的顺序):

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
}
Run Code Online (Sandbox Code Playgroud)


Lar*_*ann 8

Dart的收藏没有固有的平等.两组不相等,即使它们包含与元素完全相同的对象.

集合库提供了一些方法来定义这样的平等.在这种情况下,例如

IterableEquality().equals([1,2,3],[1,2,3])
Run Code Online (Sandbox Code Playgroud)

是一个相等,它认为两个列表完全相等,如果它们包含相同的元素.


Gün*_*uer 7

我只是偶然发现了这个

import '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");
  }
}
Run Code Online (Sandbox Code Playgroud)

更多信息https://github.com/dart-lang/bleeding_edge/tree/master/dart/pkg/collection


小智 5

虽然这个问题相当老了,但该功能还没有在 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;
 });
}
Run Code Online (Sandbox Code Playgroud)

注意:当混合集合类型(即List<Map>)时,这仍然会失败 - 它只是覆盖List<List<List>>等等。

最新的 dart 问题似乎是https://code.google.com/p/dart/issues/detail?id=2217(最后更新于 2013 年 5 月)。