我在 Java 中实现了一个 A* 算法,并且我使用 TreeSet 作为保持打开列表排序的简单方法。如果您不熟悉 A*,它基本上是一个获取从 A 到 B 的最短路径的函数,并且打开列表是一个节点列表(在我的情况下Tiles
)是根据它们与 B 的接近程度排序的。
我的对象实现了一个compareTo()
排序功能,如下所示:
@Override
public int compareTo( Tile b )
{
return ( this.f< b.f) ? -1 : ( this.f> b.f) ? 1 : 0;
}
当我尝试将一些图块添加到打开列表时,我的问题就出现了 - TreeSet 似乎用于compareTo()
检查对象是否已经存在,而不是equals()
. 由于两个不同Tiles
的值可能具有相同的f
值,因此 TreeSet 认为该对象已经存在于列表中并且不会添加它。
根据文档(或至少,我是如何阅读它的),它应该使用equals
:
“如果指定的元素不存在,则将其添加到此集合。更正式地说,如果集合不包含元素 e2,则将指定的元素 e 添加到此集合,这样(e==null ? e2==null : e.equals( e2))。” (强调我的)。
如何equals()
在调用add()
或排序contains()
时使用 TreeSet?compareTo()
对于信息,我的Tile
类不会覆盖该equals()
函数,因此它应该获得默认的return a == b
.
如果 TreeSet 无法实现我想要做的事情,那么我应该使用什么合适的集合?