1

我在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)是否应该返回相同的哈希码?

4

3 回答 3

4

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

/edit给定您的方法,
使用numerator * denominator您的哈希将是一种无效的equals方法。使用 and 的示例1/42/81/4.equals(2/8)返回true,但1/4.hashCode() == 2/8.hashCode()会评估为4 == 16,并返回false

于 2012-05-06T15:28:57.913 回答
2

等效的有理数(如 1/4 和 2/8)是否应该返回相同的哈希码?

由于您的equals()方法返回true1/4 和 2/8,因此这两个数字必须具有相同的哈希码

实现这一点的一种方法是简化分数(例如,在构建时)。这可以通过将分子和分母除以它们的GCD来完成。一旦你这样做了,任何合理hashCode()的功能都可以完成这项工作。

于 2012-05-06T15:31:17.687 回答
0

建议类似:

37*numerator + 13* denominator

对于哈希码,其中这些是素数。

我会认为 1/4 和 2/8 是不同的,除非你有一个积极的标准化政策。但这取决于你。确保你很好地记录了行为。

更新:您需要确定平等的含义。我会先规范化,然后写:

return this.numerator == r.numerator && this.denominator == r.denominator
于 2012-05-06T15:28:56.673 回答