【问题标题】:Custom hashcode and comparator for the same map?同一地图的自定义哈希码和比较器?
【发布时间】:2017-11-07 21:50:30
【问题描述】:

我需要实现一个 Map,它必须有一个自定义哈希(返回一个整数 - 年份 + 汽车型号),它还必须按降序排序。如果我使用 TreeMap,我无法制作自定义哈希,如果我使用 HashMap,我无法订购它。我怎样才能同时使用两者?我尝试使用自定义比较器制作一个 TreeMap 以降低顺序,但它忽略了我对 hashCode 的覆盖,并添加了应该在同一个地方的不同位置的元素,即使它们的 hashcode 不同。我该如何解决这个问题?

class MyComparator implements Comparator<Integer> {
    public int compare(Integer a, Integer b) {
        if (a < b) {
            return 1;
        }
        return 0;
    }
}

【问题讨论】:

  • 发布您的代码。如果您的比较器为应该不同的键返回 0,则它是错误的。没有您的代码,我们无法解释更多。
  • TreeMap 不使用 hashCode()。随意实现任何你想要的哈希码。
  • 如果您编辑您的问题以包含所有相关代码,而不是在评论中发布其中一些代码会更好。
  • 如果a &gt; b呢?
  • 它可能不能解决你所有的问题,但你的比较器是不完整的,即。它从不返回负值。阅读compare() 的规范并确保遵循它。

标签: java hashmap comparator hashcode treemap


【解决方案1】:

TreeMaps 使用它们的compareTo 方法(如果元素是可比较的)或给定的比较器对元素进行排序。他们根本不使用hashCode(),所以你可以有任何你想要的实现。

您的问题可能与比较器本身有关。您可能会遇到两个相等元素具有相同 hashCode 的情况,但比较器不会为它们返回 0。因此,您希望 TreeSet 仅具有这些元素之一,但它并不认为它们彼此相等。

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 2013-12-08
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 2016-05-27
    • 2015-11-28
    相关资源
    最近更新 更多