【问题标题】:How do I compare two lists as being equal and containing the same objects, in Dart?如何在 Dart 中比较两个列表是否相等并包含相同的对象?
【发布时间】:2013-10-31 18:00:19
【问题描述】:

我有两个列表:

List fruits = ['apples', 'bananas'];
List foods = ['apples', 'bananas'];

如何比较水果和食物并确保两个列表具有相同顺序的相同对象?

【问题讨论】:

标签: dart


【解决方案1】:

比较列表是否相等(而不是同一性)的推荐方法是使用以下包中的 Equality 类

import 'package:collection/equality.dart';

例如,

Function eq = const ListEquality().equals;
print(eq(fruits, foods)); // => true

这适用于您的情况,因为fruitsfoods 包含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

【讨论】:

    【解决方案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);
    

    这种方法的缺点是空值检查,因为这可能不是很明显的相等性检查,但是一旦发现第一个不匹配,它就会停止迭代。

    【讨论】:

      【解决方案3】:

      Flutter 有 foundation.dartlistEquals 比较列表的方法

      import 'package:flutter/foundation.dart';
      
      void main() {
        List fruits = ['apples', 'bananas'];
        List foods = ['apples', 'bananas'];
        print(listEquals(fruits, foods)); // true
      
      }
      

      另外,setEqualsmapEquals 用于比较 mapset

      【讨论】:

        猜你喜欢
        • 2012-05-11
        • 2011-05-05
        • 1970-01-01
        • 1970-01-01
        • 2021-04-07
        • 1970-01-01
        • 2016-03-06
        • 1970-01-01
        • 2017-07-10
        相关资源
        最近更新 更多