在这里,我将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]}
答案 0 :(得分:1)
List
不是值类型,并且不会覆盖operator ==
,因此它将使用默认的Object.operator ==
实现,该实现仅检查对象身份(即,是否有两个对象相同的实例)。
换句话说,即使两个单独的List
实例包含相同的元素,它们也不会比较相等。 [0, 1] != [0, 1]
。
即使List
没有提供深层的operator ==
实现,您也可以通过构造LinkedHashSet
(默认为Set
)或{{3} }并提供您自己的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);