android - 当它的子项是列表时,使用 Set 不会删除重复项

标签 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]}

最佳答案

List 不是值类型,它不会覆盖operator ==,所以它会使用默认的Object.operator ==。仅检查对象标识(即,两个对象是否是同一实例)的实现。

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

即使 List 不提供深度 operator == 实现,您也可以通过构造 LinkedHashSet 来覆盖它。 (设置 的默认值)或 HashSet显式并提供您自己的 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);

关于android - 当它的子项是列表时,使用 Set 不会删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56630915/

相关文章:

facebook - 如何确定用户登录的提供商

firebase - Cloud Firestore 的用户特定收藏夹

flutter - Flutter 的 pubspec.yaml 中依赖版本号前的脱字符号 (^) 是什么?

java - 用于下载的 Spring Action 在 Android 浏览器中不起作用

android - 文本选择的 WebView 上的灰色框问题

android - 显示软键盘时如何 "push up"屏幕

ios - Flutter 无法从 iOS 上的路径加载 File()

javascript - Webview JavaScript fontSize,color,backgroundColor 不起作用

flutter - 构建应用程序时出现弃用错误

dart - 如何抑制 "missing concrete implementation"警告?