java - 如何使 HashMap 与自定义键类型一起正常工作?

标签 java types hashmap key

我觉得我的问题很简单,但是我找不到解决方案所以我决定在这里问。我需要的是用这样的自定义键类型制作一个 HashMap:

HashMap<Pair<Integer, Integer>, StrategyPoint> myMap = new HashMap<Pair<Integer, Integer>, StrategyPoint> ();

但是我在这里遗漏了一些东西,因为 HashMap 停止正常工作。首先,Key 变得不唯一,并且可以在 keySet 中找到具有相同值的 Pair 的不同实例。此外,包含键功能并不像我想的那样工作:)。

我显然遗漏了一些东西,更有可能我应该以某种方式定义一种方法来比较我的实例与我的 Pair 类。但是,我尝试在我的 Pair 类中使用 compareTo 实现 Comparable,但它仍然不起作用。有什么建议吗?

我的原始代码有点乱,不利于阅读,所以我在这里举了一个例子来说明我的问题。

代码如下:

HashMap<Pair<Integer, Integer>, StrategyPoint> myMap = new HashMap<Pair<Integer, Integer>, StrategyPoint> ();
    Pair<Integer, Integer> myPair = new Pair<Integer, Integer>(2,2);
    StrategyPoint myPoint= new StrategyPoint(2, 2, 5, 5, false);
    myMap.put(myPair, myPoint);


    Pair<Integer, Integer> searcher = new Pair<Integer, Integer> (0,0);
    searcher.setFirst(2);
    searcher.setSecond(2);
    System.out.println(myMap.containsKey(searcher));
    System.out.println(myMap.containsKey(myPair));

执行结果为:

false

true

我已经调试了它并且搜索器实例被正确填充,但是 HashMap 似乎拒绝在其 keySet 中找到它。

最佳答案

您必须在 Pair 类上正确实现 equalshashCode

HashMap 使用这些方法来区分和哈希键类。

关于java - 如何使 HashMap 与自定义键类型一起正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15039222/

相关文章:

java - IPhone App 与 Java ServerSocket 之间的 SSL 连接

reactjs - TypeScript 条件类型 : Extract component props type from react component

c++ - 实际运行时与运行时复杂性之间的矛盾

java - 此语言级别不支持多捕获

java - 年轻代和老年代都存在字符串池?

java - 将 JAR 文件(库) checkin 版本控制工具 - 这是一个好习惯吗?

java - MVC 实践。另一个服务中的服务

types - 通用 Lisp : How to check if something is a type specifier?

go - Go 中的函数调用、赋值和 'underlying types'

rust - 如何获取包含在 Arc<> 和 RwLock<> 中的 Rust HashMap<> 的长度?