当它的子级为列表时,使用Set不会删除重复项

时间:2019-06-17 12:02:43

标签: android flutter dart

在这里,我将HashMap与数组组合在一起以产生组合。 我使用line.sort((a, b) => a.compareTo(b));对列表进行排序,以便 我有[[1,0],[1,0]]而不是[[0,1],[1,0]]

Set<List<int>> lines = new Set();
for (int key in _graph.keys) {
   for (int vertexKey in _graph[key].vertices) {
       var line = [key, vertexKey];
       line.sort((a, b) => a.compareTo(b));
       lines.add(line);
    }
}

我的预期输出是

{[0, 1], [0, 3], [0, 2], [1, 2], [2, 3],[0, 3]}

但是,我明白了 {[0, 1], [0, 3], [0, 2], [0, 1], [1, 2], [1, 2], [2, 3], [0, 2], [2, 3], [0, 3]}

1 个答案:

答案 0 :(得分:1)

List不是值类型,并且不会覆盖operator ==,因此它将使用默认的Object.operator ==实现,该实现仅检查对象身份(即,是否有两个对象相同的实例)。

换句话说,即使两个单独的List实例包含相同的元素,它们也不会比较相等。 [0, 1] != [0, 1]

即使List没有提供深层的operator ==实现,您也可以通过构造LinkedHashSet(默认为Set)或{{3} }并提供您自己的equalshashCode回调。例如:

import 'package:quiver/collection.dart' show listEquals;
import 'package:quiver/core.dart' show hashObjects;

Set<List<int>> lines = LinkedHashSet<List<int>>(equals: listEquals, hashCode: hashObjects);