我正在Java中實現A *算法,並且我使用TreeSet作爲保持打開列表排序的簡單方法。如果你不熟悉A *,它基本上是一條從A到B的最短路徑的函數,而打開的列表是根據它們與B的接近度排序的節點列表(在我的例子中爲)。TreeSet add()返回false
我的目標實現了compareTo()
功能分類,像這樣:
@Override
public int compareTo(Tile b)
{
return (this.f< b.f) ? -1 : (this.f> b.f) ? 1 : 0;
}
我的問題是當我嘗試一些瓷磚添加到開放列表 - TreeSet中似乎使用compareTo()
檢查的對象是已經存在的,而不是equals()
。由於有可能兩個不同的具有相同的值f
,TreeSet認爲該對象已經存在於列表中,並且不會添加它。
按照文檔(或者至少,我是如何讀它),它應該使用equals
:
「指定的元素添加到這個集合,如果它是不存在更正式,加如果該集合不包含元素e2,使得(e == null?e2 == null:e.equals(e2))。 (重點是我的)。
如何在調用add()
或和compareTo()
進行排序時如何讓TreeSet使用equals()
?有關信息,我的Tile
類不覆蓋equals()
函數,所以它應該得到默認return a == b
。
如果我想要做的事對TreeSet來說是不可能的,那麼我應該使用什麼合適的集合呢?
請TreeSet中添加#java的方法-doc,它表示#equals被使用,實際上它不是 – hoaz
TreeSet文檔指出,如果比較器與等號不一致,那麼所有這些賭注都是關閉的。無論您對文檔有何解釋,您都已經證明了這一點。 –
你可以檢查實現,它從不調用等於 – hoaz