检查和删除 Java HashMap 中的元素

2024-03-06

我正在尝试使用 Java 中的 HashMap 检查并删除元素。它的键是我创建的称为 ClusterKey 的类型,它的值是我创建的称为 ClusterValue 的类型。

这是导致问题的代码:

ClusterKey ck = new ClusterKey(Long.parseLong(split[0].split("=")[1]), 
                        Integer.parseInt(split[1].split("ey")[1]));
if (arg == 0) keys.put(ck, new ClusterValue(index, false));
if (arg == 1) {
    if (keys.containsKey(ck)) {
        index = keys.get(ck).messageNo;
        keys.remove(ck);
    }
    keys.put(ck, new ClusterValue(index, true));
}

问题是,即使 ClusterKey 与现有 ClusterKey 相同, containsKey() 和 remove() 似乎也不会将其识别为相等。我在 ClusterKey 类中实现了 equals() 来覆盖 Java 的 equals() 方法,如下所示:

class ClusterKey {
    long firstKey;
    int secondKey;
    public ClusterKey(long firstKey, int secondKey) {
        this.firstKey = firstKey;
        this.secondKey = secondKey;
    } public boolean equals(Object otherKey) {
        return this.firstKey == ((ClusterKey) otherKey).firstKey && this.secondKey == ((ClusterKey) otherKey).secondKey;
    }
}

所以,我很困惑。非常感谢你的帮助。

问候, 丽贝卡

更新:感谢您对我的代码的建议和反馈。我通过将 hashCode() 添加到 ClusterKey 来解决该问题,如下所示:

    } public boolean equals(Object otherKey) {
        return this.firstKey == ((ClusterKey) otherKey).firstKey && this.secondKey == ((ClusterKey) otherKey).secondKey;
    } public int hashCode() {
        return (int) firstKey + secondKey;
    } 

对于任何启用哈希的数据结构(例如HashMap, HashSet)要正常工作,其元素必须覆盖hashCode()除了equals()方法。原因是散列码用于标识要在其中放置元素(在插入期间)或搜索的存储桶(使用equals()查找期间)。

如果你不覆盖hashCode(),默认实现来自Object#hashCode()使用它会返回不同的值,即使对于您认为等效的对象(equals()方法返回true for).

这就是为什么你的

 hashMap.containsKey(ClusterKey key)

尽管密钥已经存在,但呼叫仍失败。因为,哈希码与HashMap永远不会在正确的桶中寻找钥匙。因此,你的equals()永远不会被叫到这里。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查和删除 Java HashMap 中的元素 的相关文章

随机推荐

  • 如何在 PyTorch 数据加载器中将 RGB 图像转换为灰度图像?

    我已经从 MNIST 数据集中下载了一些示例图像 jpg格式 现在我正在加载这些图像来测试我的预训练模型 transforms to apply to the data trans transforms Compose transforms
  • 尝试在javascript中打开多个窗口

    我需要点击按钮打开多个网址 正在 Chrome 上进行测试 PS 我这样做是为了自己 我只是想打开我每天早上想阅读的所有网址 例如 我不想浪费时间点击每个网址 不确定 javascript 是否是构建此类功能的正确工具 写了下面的代码 它打
  • vscode prettier 不格式化 .tsx 文件

    我已经在 Visual Studio 代码编辑器中使用 Prettier 扩展很长时间了 但最近我一直在使用 Typescript 编写 React 所以我需要配置 Prettier 来格式化 tsx files 使用以下内容编辑设置set
  • 如果我因为想要转向生产而关闭 Play 商店中的公开测试版计划,那么我的应用程序的用户会发生什么情况?

    以前曾有人问过这个问题 但没有提供答案 也没有链接到文档说明如果开发人员有公开测试版程序并决定关闭它 应用程序的用户会发生什么 这些用户是否会自动转换为生产用户 还是必须重新下载应用程序 如果关闭公开测试计划并开始将新的更新推向生产环境 他
  • Python坐标之间的转换

    有没有不同坐标系之间转换的函数 例如 Matlab 有 rho phi cart2pol x y 用于从笛卡尔坐标到极坐标的转换 看起来应该是 numpy 或 scipy 使用 numpy 您可以定义以下内容 import numpy as
  • 设置 Oracle JDBC 瘦客户端的语言

    我想在实际创建 JDBC 连接之前为其指定语言 例如 如果我在中指定了错误的 L P 凭证 DriverManager getConnection url user password 我需要得到ORA错误已本地化为我选择的语言 我使用 Or
  • 具有多个窗口的 SDL 2.0 退出事件

    我正在使用 SDL 2 0 并决定尝试制作多个窗口 不幸的是 现在我无法退出程序而不返回 IDE 并强制关闭它 事件处理尽可能简单 我只轮询退出事件 并且在添加第二个窗口之前它工作得很好 使用多个窗口时是否会忽略退出事件 如果是这样 我怎样
  • 页面重新加载后断点

    页面重新加载后我需要在断点处停止 我在代码中放置了一个断点 但重新加载后它被禁用 putting debugger 在代码中工作正常 但我想知道是否有办法在 firebug 或 chrome 开发工具中做到这一点 可能是您的页面 url 中
  • Eureka检测服务状态

    Context 我们使用 Spring Cloud Netflix 和 Eureka 作为服务发现 使用 Zuul 来代理服务并对其进行负载平衡 微服务使用NodeJS实现 并使用NPM模块注册到Eurekaeureka js 客户端 ht
  • 查询数据集

    我正在将 XML 文件中的数据读取到强类型中DataSet 数据最终存放在多个表中 我可以对其运行查询来创建非规范化视图以显示在DataGrid 输入示例
  • 如何在处理过程中更新 OpenGL 中的显示?

    距离我上次使用 OpenGL 已经过去一年多了 所以我对这个话题已经很生疏了 我正在对一张图像进行一些处理 具体来说是颜色聚类 并且我想在每次循环迭代后更新图像 这样我就可以看到发生的变化 而不是在处理完成后看到变化 这就是目前正在发生的情
  • 使用 SQL FileStream 发生内存泄漏

    我有一个使用 SQL FILESTREAM 来存储图像的应用程序 我插入一个LOT图像数量 每天数百万张图像 一段时间后 机器停止响应 似乎内存不足 查看 PC 的内存使用情况 我们没有看到任何进程占用大量内存 无论是 SQL 还是我们的应
  • 未修饰的 JDialog 边框

    我有一个关于未装饰的边界的问题JDialog使用Metal L F 查看此图片以查看此窗口上的边框 我正在尝试弄清楚如何消除或更改最外侧的蓝色边框的颜色JDialog 我查看了 UI 默认值Look Feel但我无法想出任何对此有用的方法
  • F# 中的 Seq.unfold 解释

    我正在尝试使用 F 懒惰地创建一个序列 该序列定义如下 序列的第 n 项 三角形数由下式给出 tn 1 2n n 1 所以前十个三角形 编号是 1 3 6 10 15 21 28 36 45 55 这是我到目前为止所拥有的 但它似乎不起作用
  • Mysql“VALUES 函数”已弃用

    这是我的 python 代码 它打印 sql 查询 def generate insert statement column names values format table name items insert template INSE
  • 自动化 VMWare 或 VirtualPC

    我目前正在尝试使用构建脚本 并且由于我有一个受源代码控制的 ASP net Web 部件 因此我的构建脚本应该在最后执行此操作 从网络获取 裸 Windows 2003 IIS VMWare 或 Virtual PC 映像 启动它 将文件从
  • CSS 背景图像带旋转、重复和不透明度

    我正在尝试用图像制作一个漂亮的背景 但我希望重复图像以填充屏幕 不透明度设置为 0 5 并旋转 45 度 我尝试了很多方法来实现这一目标 但没有成功 有人有主意吗 在此 Codepen 中 我将图像旋转且不透明 但无法使背景重复工作 bac
  • javascript 中可点击多个 css 类

    我怎样才能做到甚至 toggle cart 也可以像 clickerHeader 一样点击 但保留其悬停效果 见箭头 请参见http jsfiddle net realitylab STE48 3 http jsfiddle net rea
  • 通过 REST 调用停止 TeamCity 构建

    是否可以通过 REST API 取消当前正在运行的构建 我有一个集成 可以获取当前正在运行的构建 如果给定类型的构建失败 我想终止它们 我知道如何列出给定类型的失败构建 然后如何传递停止命令 从 TeamCity 8 1 开始 可以停止使用
  • 检查和删除 Java HashMap 中的元素

    我正在尝试使用 Java 中的 HashMap 检查并删除元素 它的键是我创建的称为 ClusterKey 的类型 它的值是我创建的称为 ClusterValue 的类型 这是导致问题的代码 ClusterKey ck new Cluste