我在TreeSet中從我正在處理的遊戲中刪除一個單元時遇到了問題。我正在製作一個塔防遊戲,路徑被分成不同長度的塊。塊知道它內部的單元和路徑上的下一個塊。當單位離開塊的邊界時,塊將其從列表中移除並將其添加到下一個塊。compareTo和TreeSet的問題
我正在使用TreeSet來跟蹤塊中單元的順序,這樣我就可以知道哪個單元沿着路徑最遠。這些單位有一個位置字段,用於跟蹤他們所在的路徑有多遠,位置越高,位置越遠。
在我的一些塊中,我注意到當它試圖從它的TreeSet中刪除一個單元時,remove將返回false。我使用了一些斷點,我可以看到該單元實際上在TreeSet中,所以我認爲我的問題是我的攻擊單位的compareTo方法。
這裏是我的代碼的compareTo:
public int compareTo(Object other) {
if (other != null && AttackingUnit.class.isAssignableFrom(other.getClass())) {
AttackingUnit o = (AttackingUnit) other;
int amount = position - o.position;
if (amount != 0) {
return amount;
} else if (amount == 0 && this == o) {
return 0;
}
}
return 1;
}
一個地方我注意到這個問題塊是單位進入前一個塊,拿一半的一角,並退出右側。該塊有兩個ArrayLists,一個用於從上到下(enPath)的單元,另一個用於從左到右的單元(exPath)。下面有其中我有問題的代碼:
for (int i = 0; i < exPath.size(); i++) {
AttackingUnit unit = exPath.get(i);
unit.stepX();
if (unit.getX() > rightX) {
nextBlock.addUnit(unit);
units.remove(unit);
exPath.remove(unit);
i--;
}
}
單位爲exPath和在單元(TreeSet中),但units.remove(單元)返回false。關於如何在AttackingUnit上修改compareTo來解決這個問題的任何想法?
我給了這個鏡頭,我的印象是,如果compareTo返回0,TreeSet會認爲這些對象是相同的,並且不會添加該單元。我很擔心這個,因爲如果兩個單位佔據相同的空間,那麼這個單位就不會被添加到樹中。 – Jonathan 2011-05-08 20:53:45
如果你需要兩個對象在相同的位置不同,你需要一些其他的標準來區分它們,比如名字等。在這種情況下,不要簡單地返回1,因爲它不是對稱的。 – 2011-05-08 20:57:28
我現在唯一擁有的單位是健康,x,y和位置。如果他們都是一樣的有一種獲得Java使用的變量ID的方法,所以我可以看到他們是否完全相同或不相同?如果他們不是,我可以用它來比較。 – Jonathan 2011-05-08 21:03:22