1

Javaで有理数をモデル化するクラスを実装しました。これには、分子と分母をモデル化する2つの整数があります。Objectのハッシュコードメソッドをオーバーライドする必要があるため、同じ番号が同じハッシュコードを持ちます。

私は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()truenew Double((double) numerator / denominator).hashCode()

/ editハッシュに
使用することは、メソッドを考えると無効なアプローチになります。との例を使用すると、が返されますが、と評価されて、が返されます。numerator * denominatorequals1/42/81/4.equals(2/8)true1/4.hashCode() == 2/8.hashCode()4 == 16false

于 2012-05-06T15:28:57.913 に答える
2

同等の有理数(1/4や2/8など)は同じハッシュコードを返す必要がありますか?

equals()メソッドはtrue1/4と2/8を返すため、2つの数値は同じハッシュコードを持っている必要があります

これを実現する1つの方法は、分数を単純化することです(たとえば、建設時)。これは、分子と分母の両方を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 に答える