1

異なる GridPositions(x,y) 間に線を引こうとしています。すべての GridPos には、北、東、南、西の 4 つの接続があります。問題は、GridPos(1,1) から GridPos(2,2) に線を描画すると、後で GridPos(2,2) と GridPos(1,1) の間に逆方向の線も描画されることです。

このクラスで問題を解決しようとしました (WarpGate は GridPos と同じです):

public class GateConnection {

private WarpGate gate1 = null;
private WarpGate gate2 = null;

public GateConnection(WarpGate gate1, WarpGate gate2) {
    super();
    this.gate1 = gate1;
    this.gate2 = gate2;
}

@Override
public int hashCode() {
    final int prime = 31;

    int result = prime * ((gate1 == null) ? 0 : gate1.hashCode());
    result += prime * ((gate2 == null) ? 0 : gate2.hashCode());
    return result;
}

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

}

このクラスを HashSet に追加すると、二重描画はなくなりますが、hashValue が常に一意かどうかはわかりません。

WarpGate の HashCode (Eclipse によって自動生成):

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

今のところ、ArrayList を使用します。GateConnection が存在するかどうかを確認し、存在しない場合は追加します。しかし、このバージョンは HashSet を使用するよりもはるかに多くのリソースを必要とします。

編集:

白い四角形はペイントされる接続、数字は GridPositions(x|y)、赤い矢印は四角形がペイントされる 2 つの方向です。GridPos(2|2) には GridPos(4|2) への接続があり、 (4|2) から (2|2) ここに画像の説明を入力

4

1 に答える 1

2

ATreeSetは no を使用しhashCode()ませんequals()。を使用しますが、セマンティクスを尊重compareTo()するために一貫性があることを確認する必要があります。equals()Set

の場合HashSethashCode()格納されたオブジェクトの は一意である必要はありません。equals()実際、必要に応じてすべてのアイテムに同じコードを返すことができ、正しく実装されていればアイテムを失うことなく保存されます。良いものhashCode()はパフォーマンスのみを向上させます。

唯一の重要なルールは、2 つの等しいアイテムが同じハッシュ コードを生成する必要があるということです。

gate1とが同じオブジェクトgate2内で決して等しくないことを保証できる限り、実装は問題ないように見えます。GateConnectionそれらが等しい場合、2 つのGateConnectionオブジェクトは異なるハッシュ コードを持つ可能性がありますが、等しいと報告されます。に格納されている場合、予期しない動作につながる可能性がありHashSetます。

たとえば、GateConnection((1,1), (1,1))GateConnection((1,1), (7,9)) と同じですが、ハッシュ コードは異なります。

于 2012-07-21T22:23:51.807 に答える