Java 实现Comparable接口踩坑记录

本文记录了在实现A*算法时使用Java的TreeSet数据结构遇到的问题。自定义类型实现Comparable接口时,不恰当的compareTo()方法导致了对象相等判断错误。在修复过程中,虽然避免了equals()与compareTo()不一致的问题,但又引入了新的问题,即TreeSet中出现了重复对象。最终了解到,正确的compareTo()方法应确保对象间的大小关系唯一确定,以保证二叉搜索树的正确性。
摘要由CSDN通过智能技术生成

好久没有写代码了,最近尝试写个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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值