3

クラスがあります

final class BuildingPair {

    int mBA;
    int mBB;

    public BuildingPair(int pBuildingA,int pBuildingB) {
        mBA = pBuildingA;
        mBB = pBuildingB;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + mBA;
        result = prime * result + mBB;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        BuildingPair other = (BuildingPair) obj;
        if ((mBA==other.mBA&&mBB==other.mBB)||(mBA==other.mBB&&mBB==other.mBA)) return true;
        return false;
    }
}

2つのオブジェクトを比較したいのですが、両方が同じ建物IDを持っている場合、それらは等しくなります

したがって、次の場合は両方向で等しくなる必要があります。

BuildingPair(1,2) vs BuildingPair(2,1) 
BuildingPair(1,2) vs BuildingPair(1,2)
BuildingPair(2,1) vs BuildingPair(1,2)

equalsメソッドは問題ないと思いますが、ハッシュコードが間違っています。

4

3 に答える 3

8

A,B合格か。かにかかわらず、同じ結果を計算するものが必要ですB,A。はるかに微妙な解決策があるかもしれませんが、私はおそらく次のことを行います:

@Override
public int hashCode() {
    return mBA * mBB;
}

または、可換な演算子を使用するその他のもの。


または、コンストラクターを変更して、コンストラクターが常に格納min(a,b)されるようmBAmax(a,b)することもできます。これによりmBB、比較コードを簡略化して、ハッシュコードを現在の状態に保つことができます。

于 2012-08-15T13:22:11.600 に答える
3

対称ハッシュコード(hashcode(a,b) == hashcode(b,a))が必要です。次に例を示します。

return mBB ^ mBA;

(現在のコードは対称ではありません-例:hascode(2,1)= 1024しかしhashcode(1,2)= 994)

注:これは、次のハッシュコードから着想を得ていますLong

return (int)(value ^ (value >>> 32));
于 2012-08-15T13:21:53.797 に答える
3

順序付けされていない場合は、コードの残りの部分を簡略化する任意の順序を使用できます。

public BuildingPair(int pBuildingA,int pBuildingB) {
    mBA = Math.min(pBuildingA, pBuildingB);
    mBB = Math.max(pBuildingA, pBuildingB);
}

残りのメソッドを通常どおりにコーディングすると、BuildingPair(2,1)はBuildingPair(1,2)とまったく同じになります。

于 2012-08-15T13:26:09.727 に答える