TreeSet自定义对象compareTo(Object o)方法

java小白,最近学到TreeSet,我们都知道在存储自定义对象时,需要使用Comparable或使用Comparator 存储。

刚刚碰到这样一段代码。

public class Person implements Comparable {
    int age;
    String name;

    Person(int age,String name){
        this.age=age;
        this.name=name;

    }

    @Override
    public int compareTo(Object o) {
        Person p=(Person)o;
        if (p.age% 2 == 0) {
            return -1;
        } else {
            return 1;
        }
    }
}
public class Test1 {
    public static void main(String[] args) {
        TreeSet<Person> treeSet = new TreeSet<>();
        treeSet.add(new Person(1,"aa"));
        treeSet.add(new Person(2,"cc"));
        treeSet.add(new Person(3,"bb"));
        treeSet.add(new Person(4,"dd"));
        treeSet.add(new Person(5,"ee"));


        for (Person p : treeSet) {
            System.out.println(p.age);
        }
}

执行结果为:

1
3
5
4
2

自己刚开始对compareTo(Object o)方法不够了解,所以debug半天才弄明白。

现在分享下思路:

compareTo(Object o)方法中的Object o 为当前集合中所存在的元素对象,一般我们正常比大小时,比如将代码写成按age大小升序排列:

 @Override
    public int compareTo(Object o) {
        Person p=(Person)o;
        return this.age-p.age;
    }

然后主方法按照age=1 2 3 4 5依次插入对象时,第一次直接插入1;第二次插入2时,age=2的当前对象将与集合中所有元素按照compareTo(Object o)中的规则一一比较,即this.age-p.age=2-1,return 1,表示当前对象(age=2)比集合内对象(age=1)大,345依次比较集合内元素所以主方法遍历集合结果为:12345。

但当compareTo(Object o)方法如下时,其比较规则发生变化。

 @Override
    public int compareTo(Object o) {
        Person p=(Person)o;
        if (p.age% 2 == 0) {
            return -1;
        } else {
            return 1;
        }
    }

运行程序过程如下,第一次还是插入1。第二次开始与集合中的元素相比较时,当前元素(this.age)能否比集合内元素(p.age)大,完全取决于被比较的元素(p.age)是否为单数。

如果被比较元素为单数则return 1,表示当前元素大于集合内被比较的元素。例如第二次插入2时,2和1的大小,取决于1。1不能被2整除所以return 1,表示2比1大。

第三次add传入3,3按照compareTo方法规则分别与1,2进行比较,得出3>1且3<2

第四次add传入4,4按照compareTo方法规则分别与1,2,3进行比较,得出2>4>3>1

第五次传入5,5按照compareTo方法规则分别与1,2,3,4进行比较,得出1<3<5<4<2

因而结果为13542。

树形结构如下:

以上是本人小白理解,如有错误烦请大佬指正,谢谢。

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值