2

にを保存するという面白い状況がCoordinateありHashMap<Coordinate, GUIGameField>ます。

さて、それについての奇妙なことは、私がコードの断片を持っているということです。それは、座標を2回使用してはならないことを保護する必要があります。しかし、このコードをデバッグすると、次のようになります。

if (mapForLevel.containsKey(coord)) {
    throw new IllegalStateException("This coordinate is already used!");
} else {
    ...do stuff...
}

...containsKey常に、を返しますがfalse、ハッシュコード9731の座標をマップに保存し、現在の座標にもハッシュコード9731があります。

その後、次のmapForLevel.entrySet()ようになります。

(java.util.HashMap$EntrySet) [(270,90)=gui.GUIGameField@29e357, (270,90)=gui.GUIGameField@ca470]

何が間違っていたのでしょうか?アイデアが足りなくなった。助けてくれてありがとう!

public class Coordinate {
    int xCoord;
    int yCoord;

    public Coordinate(int x, int y) {
        ...store params in attributes...
    }

    ...getters & setters...

    @Override
    public int hashCode() {
        int hash = 1;
        hash = hash * 41 + this.xCoord;
        hash = hash * 31 + this.yCoord;
        return hash;
    }
}
4

4 に答える 4

5

正しく機能させるにはequals、に加えてオーバーライドする必要があります。hashCode

hashCode編集:私はあなたがあなたの中で使うべきであると間違って述べましたequals-これは正しくありませんでした。2つの等しいオブジェクトに対して同じ結果をhashCode返す必要がありますが、それでも異なるオブジェクトに対して同じ結果を返す場合があります。

于 2012-10-14T15:32:29.087 に答える
3

equals()座標クラスのメソッドを実装するのを忘れたようです。これは契約により義務付けられています。Hahは、equalsを使用して2つのエントリを同じハッシュコードと比較します。あなたの場合、Object.equals()メモリ内のオブジェクトへの参照に基づいているため、2つの異なるオブジェクトでは常に異なると呼ばれます。

于 2012-10-14T15:33:43.513 に答える
1

hashCodeと一緒にequalsを実装する必要がある理由は、ハッシュテーブルの動作方法によるものです。

ハッシュテーブルは、整数値(キーのハッシュ)を値に関連付けます。これをValueオブジェクトの配列と考えてください。このテーブルに挿入すると、値はkey.hashCode()の位置に保存されます。

これにより、テーブル内の任意のオブジェクトを「すぐに」見つけることができます。そのオブジェクトのhashCodeを計算するだけで、テーブルのどこにあるかがわかります。オブジェクトを見つけるためにツリーをナビゲートする必要があるツリーとは対照的に、それを考えてください)。

ただし、このアプローチには問題があります。同じハッシュコードを持つオブジェクトが複数存在する可能性があります。これにより、2つ(またはそれ以上)のキーを誤って同じ値に関連付ける可能性があります。これは衝突と呼ばれます。

この問題を解決する簡単な方法があります。各ハッシュコードを1つの値にマッピングする代わりに、キーと値のペアのリストにマッピングできます。

これで、ハッシュマップでオブジェクトを探すたびに、ハッシュを計算した後、そのリスト(そのハッシュコードに関連する「値」のリスト)を調べて、正しいものを見つける必要があります。

これが、ハッシュマップのキーに常にequalsを実装する必要がある理由です。

注:ハッシュテーブルは実際にはこれよりも少し複雑ですが、考え方は同じです。衝突の解決について詳しくは、こちらをご覧ください。

于 2012-10-14T16:08:57.540 に答える
0

hashCodeクラスでメソッドを定義しますCoordinate一意のオブジェクトに対しては一意のコードを返し、同じオブジェクトに対しては同じコードを返すようにしてください。

于 2012-10-14T15:33:01.343 に答える