在这里,我将 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]}
最佳答案
List
不是值类型,它不会覆盖operator ==
,所以它会使用默认的Object.operator ==
。仅检查对象标识(即,两个对象是否是同一实例)的实现。
换句话说,两个单独的 List
实例不会比较相等,即使它们包含相同的元素。 [0, 1] != [0, 1]
。
即使 List
不提供深度 operator ==
实现,您也可以通过构造 LinkedHashSet
来覆盖它。 (设置
的默认值)或 HashSet
显式并提供您自己的 equals
和 hashCode
回调。例如:
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);
关于android - 当它的子项是列表时,使用 Set 不会删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56630915/