0

私はこのクラスを持っています...

public class StartStopTouple {

    public int iStart;
    public int iStop;
    public int iHashCode;

    public StartStopTouple(String start, String stop) {
        this.iStart = Integer.parseInt(start);
        this.iStop = Integer.parseInt(stop);
    }

    @Override
    public boolean equals(Object theObject) {

        // check if 'theObject' is null
        if (theObject == null) {
            return false;
        }
        // check if 'theObject' is a reference to 'this' StartStopTouple... essentially they are the same Object
        if (this == theObject) {
            return true;
        }

        // check if 'theObject' is of the correct type as 'this' StartStopTouple
        if (!(theObject instanceof StartStopTouple)) {
            return false;
        }

        // cast 'theObject' to the correct type: StartStopTouple
        StartStopTouple theSST = (StartStopTouple) theObject;

        // check if the (start,stop) pairs match, then the 'theObject' is equal to 'this' Object
        if (this.iStart == theSST.iStart && this.iStop == theSST.iStop) {
            return true;
        } else {
            return false;
        }
    } // equal() end

    @Override
    public int hashCode() {
        return iHashCode;
    }
}

...そして、あるオブジェクトが他のオブジェクトと等しい場合にのみ、そのようなオブジェクト間の同等性をiStart定義しiStopます。iStartiStop

をオーバーライドしたのでequals()、オーバーライドする必要がありますhashCode()が、このクラスに適切なハッシュ関数を定義する方法がわかりません。iStartandを使用してこのクラスのハッシュ コードを作成するには、どのような方法がよいでしょうiStopか?

4

3 に答える 3

2

Bloch の「Effective Java」から:

int iHashCode = 17;
iHashCode = 31 * iHashCode + iStart;
iHashCode = 31 * iHashCode + iStop;

注: 31 が選択されているのは、31 による乗算が VM によってビット操作として最適化される可能性があるためです。(ただし、@Ted Hopp で言及されているように、値を 1 回しか計算していないため、パフォーマンスは役に立ちません。)

iHashCode注:最大の を超えてロールオーバーしても問題ありませんint

于 2011-06-06T00:30:03.547 に答える
2

特にあなたがそれをメモするつもりなので、私はこれを使いたくなるでしょう:

Long.valueOf((((long) iStart) << 32) | istop)).hashcode();
于 2011-06-06T00:30:05.020 に答える
2

最も単純なものが最適かもしれません

iHashCode = iStart^iStop;

2 つの値の XOR

これにより、開始と停止が交換されたときに等しいハッシュコードが得られることに注意してください

あなたができる別の可能性として

iHashCode = ((iStart<<16)|(iStart>>>16))^iStop;

この最初のバレル シフトは 16 で開始し、xor はそれで停止するため、最下位ビットが xor で分割されます (開始が 65k (より正確には 2^16) を超えない場合は、その(iStart>>>16)部分を省略できます)

于 2011-06-06T00:36:30.247 に答える