異なる 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)