我已经实现了一个类来模拟java中的有理数,它有两个整数来模拟分子和分母。我需要覆盖Object的hashcode方法,因此相同的数字具有相同的哈希码。
我已经定义了我的equals()方法:
public boolean equals(Object obj) {
Racional r = null;
if (obj instanceof Racional) {
r = (Racional) obj;
} else {
return false;
}
return r.getDenominador() * this.numerador == r.getNumerador() * this.denominador;
}
关于这个:
返回分子*分母会是一个好方法吗?
等效有理数(如1/4和2/8)是否会返回相同的哈希码?
答案 0 :(得分:4)
这完全取决于您实施equals
方法的方式。如果obj1.equals(obj2)
为true
,则obj1.hashCode() == obj2.hashCode()
也应为true
。我可能只会使用new Double((double) numerator / denominator).hashCode()
作为我的哈希值,但您的要求可能不允许这样做。
/编辑
鉴于您的numerator * denominator
方法,使用equals
作为哈希将是一种无效的方法。使用1/4
和2/8
的示例,1/4.equals(2/8)
将返回true
,但1/4.hashCode() == 2/8.hashCode()
将评估为4 == 16
,并返回false
}。
答案 1 :(得分:2)
等效有理数(如1/4和2/8)是否会返回相同的哈希码?
由于您的equals()
方法返回true
1/4和2/8,the two numbers must have the same hash code。
实现这一目标的一种方法是简化分数(例如,在施工时)。这可以通过将分子和分母除以GCD来完成。执行此操作后,任何合理的hashCode()
函数都可以完成此任务。
答案 2 :(得分:0)
建议类似:
37*numerator + 13* denominator
用于哈希码,其中这些是素数。
除非你有一个积极的规范化政策,否则我认为1/4和2/8是不同的。但这取决于你。确保记录好行为。
更新: 你需要决定平等意味着什么。我会先规范化然后再写:
return this.numerator == r.numerator && this.denominator == r.denominator