【问题标题】:Java hashCode() override for edge class边缘类的 Java hashCode() 覆盖
【发布时间】:2012-11-20 15:11:39
【问题描述】:

我正在使用 Java 开发一个图形库(完整上下文为 https://github.com/aisthesis/java-graph2012),并且需要为不指向边的 WeightedEdge 类覆盖 hashCode()。也就是说,我设置了我的 equals() 覆盖方法,以便对于 2 个加权边 e1 和 e2,如果以下条件之一成立,它们是相等的(from() 和 to() 方法返回尾部和头部顶点边缘):

  1. e1.from() == e2.from() && e1.to() == e2.to() 或
  2. e1.from() == e2.to() && e1.to() == e2.from()

在另一种情况下,我想创建一个加权边的 HashSet,我最终会得到重复的边,除非我也以与我的 equals() 覆盖一致的方式覆盖 hashCode() 方法。

所以,这是我的简单解决方案(我没有干扰 Java 的默认 hashCode() 用于我的 Vertex 类以及从和引用 Vertex 对象):

@Override
public int hashCode() {
    return from.hashCode() + to.hashCode();     
}

我的推理:

  1. 这是高效的,因为加法的效率几乎是可以达到的(我猜也可以对 2 个哈希码进行异或运算?)
  2. 它是对称的,所以 反转 from 和 to 将给出相同的哈希码
  3. 通常会 如果顶点不同,则提供不同的哈希码。

第 3 点显然远未达到 100%,所以我的部分问题是这是否重要。

我的一般问题:在这种情况下这是覆盖 hashCode() 的好方法吗?

【问题讨论】:

标签: java graph hashcode


【解决方案1】:

如果fromto 有合理的hashCode() 实现,你的解决方案就可以了。

【讨论】:

  • 在向 HashSet 添加大量边的同时还能很好地避免冲突,您认为异或运算会更好吗?
  • @MarshallFarrier:我没有理由认为 XOR 会比整数加法更快,或者导致更少的冲突。我认为两者都应该工作得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
  • 2014-06-12
  • 2013-06-11
  • 2020-06-09
相关资源
最近更新 更多