Java中集合TreeSet的自定义排序问题

TreeSet是属于Set接口中的实现类,对于存入的元素,有着不可重复、无序,但可根据一定排序规则自动排序的特性。TreeSet放入的元素,其实是放入了TreeMap中的key部分(所以底层数据结构是用到了二叉树的,这在排序中也是重要的一种排序法则。创建一个TreeSet对象的时候,实际上是new了一个TreeMap集合,放到TreeSet集合中的元素,等同于放到TreeMap集合key部分了。TreeMap集合底层是二叉树

什么是自定义类型时的排序呢?比如我创建了一个Person类,设定成员数据、构造方法:

那么,这时候,我们通过该类创建多个实例对象,同时创建一个TreeSet实例对象,并放入其中:

运行结果如下:

 可以看到关键字"Cannot be cast to class java.lang.Comparable",无法进行比较,问题就出在是否实现了Comparable接口上。

解决办法:

        TreeSet要想实现自定义类的排序,必须让相应的类实现Comparable接口,并实现方法,写入自定义的排序规则,例如:

(注意给类重写toString方法)此时再次运行上述测试程序,结果如下:

可以发现,我们通过定义年龄从小到大的排序规则,成功让Animals对象进行了年龄上的升序。至于排序规则怎么怎么实现,具体需要参考到数据结构中二叉树的相关知识了(左子树大于右子树,返回正数往右子树找,返回负数往左子树找,直到this.age-o.age为0即二者相等时就可以返回相应节点了。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜗牛变涡流

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值