我尝试在不同的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),红色箭头是绘制矩形的两个方向,因为GridPos(2 | 2)与GridPos(4 | 2)和(4 | 2)至(2 | 2)
最佳答案
TreeSet
既不使用hashCode()
也不使用equals()
。它使用compareTo()
,尽管您应确保它与equals()
一致以尊重Set
语义。
对于HashSet
,存储对象的hashCode()
不必唯一。实际上,如果需要,您可以为每个项目返回相同的代码,并且如果正确实现了equals()
,它们仍将被存储而不会丢失任何项目。好的hashCode()
仅会提高性能。
唯一的关键规则是两个相等的项必须生成相同的哈希码。
只要可以保证gate1
和gate2
在同一GateConnection
对象中永远不相等,您的实现就可以了。如果它们相等,则两个GateConnection
对象可能具有不同的哈希码,但被报告为相等。如果将它们存储在HashSet
中,则会导致不可预测的行为。
例如。 GateConnection((1,1),(1,1))等于GateConnection((1,1),(7,9)),但哈希码不同。