我正在使用 Java 中的图形库(完整上下文为 https://github.com/aisthesis/java-graph2012),并且需要为不指向边的 WeightedEdge 类覆盖 hashCode()。也就是说,我设置了我的 equals() 覆盖方法,以便对于 2 个加权边 e1 和 e2,如果以下条件之一成立,它们是相等的(from() 和 to() 方法返回尾部和头部顶点边缘):
- e1.from() == e2.from() && e1.to() == e2.to() 或
- e1.from() == e2.to() && e1.to() == e2.from()
在另一种情况下,我想创建一个加权边的 HashSet,并且我最终会得到重复的边,除非我也以与我的 equals() 覆盖一致的方式覆盖 hashCode() 方法。
所以,这是我的简单解决方案(我没有干扰 Java 的默认 hashCode() 用于我的 Vertex 类以及从和引用 Vertex 对象):
@Override
public int hashCode() {
return from.hashCode() + to.hashCode();
}
我的推理:
- 它是有效的,因为加法的效率与一个可以得到的一样高(我想一个也可以对 2 个哈希码进行异或?)
- 它是对称的,因此从和到反转将给出相同的哈希码
- 如果顶点不同,它通常会提供不同的哈希码。
第 3 点显然远不是 100%,所以我的部分问题是这是否重要。
我的一般问题:这是在这种情况下覆盖 hashCode() 的好方法吗?