好久没有写代码了,最近尝试写个A*算法练练手,过程中遇到了一些问题记录下来。
由于A*算法在获取当前格的时候取一个集合中的最小值,所以尝试使用TreeSet作为数据结构。
自定义类型实现了Comparable接口用以存放进TreeSet。
而实现的compareTo(Object o)方法的定义实在需要谨慎,因为我就在这遇到了一个毁天灭地大问题。
我的目标是让一个自定义类型根据某个变量的大小进行排序,想当然写了如下代码:
public int compareTo(Apath apath) {
// TODO 自动生成的方法存根
if(F>apath.getF()){
return 1;
}else if(F<apath.getF()){
return -1;
}else {
return 0;
}
}
问题来了,return 0意味着两个对象相等,比如我这里使用的TreeSet调用contains(Object o)方法时,两个不同对象的F相同时会当成同一个对象。愚蠢。
接下来一拍脑袋,加了一点东西,以为这样就没事了。
public int compareTo(Apath apath) {
// TODO 自动生成的方法存根
if(F>apath.getF()){
return 1;
}else if(F<apath.getF()){
return -1;
}else if(this == apath){
return 0;
}else {
return 1;
}
}