有理数的哈希码

时间:2012-05-06 15:26:14

标签: java

我已经实现了一个类来模拟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)是否会返回相同的哈希码?

3 个答案:

答案 0 :(得分:4)

这完全取决于您实施equals方法的方式。如果obj1.equals(obj2)true,则obj1.hashCode() == obj2.hashCode()也应为true。我可能只会使用new Double((double) numerator / denominator).hashCode()作为我的哈希值,但您的要求可能不允许这样做。

/编辑
鉴于您的numerator * denominator方法,使用equals作为哈希将是一种无效的方法。使用1/42/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