如果 2 个列表或 2 个地图在长度和内容上完全等于吃掉其他人,如何解决

问题描述 投票:0回答:1

我有 2 个动态列表和 2 个地图

2 列表

 List<dynamic> superDeepList1 = [
      [
        {
          'name': 'Alice',
          'age': 30,
          'height': 5.8,
          'isStudent': false,
          'friends': ['Bob', 'Carol', 'David'],
          'address': {
            'street': '123 Main St',
            'city': 'Wonderland',
            'zipcode': '12345'
          }
        },
        {
          'name': 'Bob',
          'age': 25,
          'height': 6.1,
          'isStudent': true,
          'friends': ['Alice', 'Carol'],
          'address': {
            'street': '456 Elm St',
            'city': 'Dreamville',
            'zipcode': '54321'
          }
        },
        'This is a string item'
      ],
      [
        {
          'name': 'Carol',
          'age': 28,
          'height': 5.5,
          'isStudent': true,
          'friends': ['Alice', 'Bob', 'David'],
          'address': {
            'street': '789 Oak St',
            'city': 'Fantasia',
            'zipcode': '67890'
          }
        },
        {
          'name': 'David',
          'age': 32,
          'height': 5.9,
          'isStudent': false,
          'friends': ['Alice', 'Carol'],
          'address': {
            'street': '321 Pine St',
            'city': 'Neverland',
            'zipcode': '09876'
          }
        },
        'Another string item'
      ]
    ];



List<dynamic> superDeepList2 = [
  [
    {
      'name': 'Alfdsfe',
      'age': 36,
      'height': 5.8,
      'isStudent': false,
      'friends': ['Bob', 'Carol', 'David'],
      'address': {
        'street': '123 Main St',
        'city': 'Wonderland',
        'zipcode': '12345'
      }
    },
    {
      'name': 'Bob',
      'age': 25,
      'height': 6.1,
      'isStudent': true,
      'friends': ['Alice', 'Carol'],
      'address': {
        'street': '456 Elm St',
        'city': 'Dreamville',
        'zipcode': '54321'
      }
    },
    'This is a string item'
  ],
  [
    {
      'name': 'Carol',
      'age': 28,
      'height': 5.5,
      'isStudent': true,
      'friends': ['Alice', 'Bob', 'David'],
      'address': {
        'street': '789 Oak St',
        'city': 'Fantasia',
        'zipcode': '67890'
      }
    },
    {
      'name': 'David',
      'age': 32,
      'height': 5.9,
      'isStudent': false,
      'friends': ['Alice', 'Carol'],
      'address': {
        'street': '321 Pine St',
        'city': 'Neverland',
        'zipcode': '09876'
      }
    },
    'Another string item'
  ]
];

2 地图

Map<String, dynamic> superDeepMap1 = {
  'outerKey1': {
    'innerKey1': {
      'nestedKey1': 'value1',
      'nestedKey2': 'value2',
      'nestedKey3': {
        'deepNestedKey1': 'deepValue1',
        'deepNestedKey2': 'deepValue2'
      }
    },
    'innerKey2': {
      'nestedKey4': 'value4',
      'nestedKey5': 'value5'
    }
  },
  'outerKey2': {
    'innerKey3': {
      'nestedKey6': 'value6',
      'nestedKey7': 'value7'
    },
    'innerKey4': {
      'nestedKey8': 'value8',
      'nestedKey9': 'value9'
    }
  }
};


Map<String, dynamic> superDeepMap2 = {
  'outerKey1': {
    'innerKey1': {
      'nestedKey1': 'value1',
      'nestedKey2': 'value2',
      'nestedKey3': {
        'deepNestedKey1': 'deepValue1',
        'deepNestedKey2': 'deepValue2'
      }
    },
    'innerKey2': {
      'nestedKey4': 'value4',
      'nestedKey5': 'value5'
    }
  },
  'outerKey2': {
    'innerKey3': {
      'nestedKey6': 'value6',
      'nestedKey7': 'value7'
    },
    'innerKey4': {
      'nestedKey8': 'value8',
      'nestedKey9': 'value9'
    }
  }
};
 

如果

superDeepList1
== superDeepList2 的长度和内容完全相同,如何判断。和地图同样的问题。

到目前为止我发现的最好方法是以下

https://pub.dev/packages/collection

bool listsEqual = const DeepCollectionEquality().equals(superDeepList1,superDeepList2);

但是有没有不使用外部包的短代码?

dart
1个回答
0
投票

不。平台库中没有类似

DeepCollectionEquality
的内容。 这就是为什么它位于
package:collection
中,它的目的是具有
dart:collection
中没有的功能,并且不需要 位于平台库中。

您可以编写自己的代码。如果您假设所有映射都是标准的基于相等的哈希映射,那么这是最简单的。如果地图使用不同的平等概念,那么比较它们......很棘手。所以不要这样做。

这是简单的代码:

bool equals(Object? v1, Object? v2) { if (identical(v1, v2) || v1 == v2) return true; if (v1 is Map) return v2 is Map && mapsEqual(v1, v2); if (v1 is List) return v2 is List && listEqual(v1, v2); if (v1 is Set) return v2 is Set && setEqual(v1, v2); if (v1 is double) { return v1.isNaN && v2 is double && v2.isNaN; } return false; } bool mapsEqual(Map map1, Map map2) { if (map1.length != map2.length) return false; for (var key in map1.keys) { var value1 = map1[key]; var value2 = map2[key]; if (value1 == null && (value2 != null || !map2.containsKey(key))) { return false; } if (!equals(value1, value2)) return false; } return true; } bool setEqual(Set v1, Set v2) { if (v1.length != v2.length) return false; for (var v in v1) { if (!v2.contains(v)) return false; } return true; } bool listEqual(List v1, List v2) { if (v1.length != v2.length) return false; for (var i = 0; i < v1.length; i++) { if (!equals(v1[i], v2[i])) return false; } return true; }
    
© www.soinside.com 2019 - 2024. All rights reserved.