A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孔斌 中级黑马   /  2013-2-9 15:29  /  1958 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

TreeSet:可以对Set集合中的元素进行排序。是不同步的,那么如何判断元素唯一性的呢?



3 个回复

倒序浏览
TreeSet:可以对集合中的元素进行排序,是不不同步的
判断元素唯一性的方式:即使根据比较方法的返回结果是否是为0,如果为0,则是相同的元素不存如集合。不为0就根据返回结果查找存储位置。
TreeSet 对元素进行排序的方式一:
         让元素自身具备比较功能,就需要实现comparable接口,覆盖comparaTo( )方法。
如果不要按照对象中具备的自然顺序进行排序,如果对象中不具备自然顺序,怎么办?
         那就使用treeset集合第二种排序方式二(自定义比较器):
        让集合具备一个比较器实现比较功能,定义一个比较器类实现comparator接口,覆盖compare方法。将该比较器对象作为参数传递给TreeSet集合的构造函数。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
首先,在回答你的问题之前,我们首先要清楚TreeSet的两个特点


1、TreeSet是集合,而集合中是不允许有重复元素的,所以在向TreeSet中添加对象时,它必须
保证里面的对象不重复。
2、TreeSet还是一个有序的集合,它里面存放的元素都是有序的(当然不是按照元素存放的顺序排的)。


其次,既然明白了TreeSet的这两个特点,那么TreeSet到底是运用什么算法来满足这两个特点呢?

为了这个目的,TreeSet要求向里面添加的对象都是“具有比较性”的,或者在定义TreeSet集合时就添加
一个“比较器”。

最后,各种比较方式的原理

1)对象自身具有比较性

此时要求对象实现Comparable接口,实现其中的compareTo()方法,当调用此方法时,该方法将比较
此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数,
如果返回“0”,则表明此对象与TreeSet中的已有对象重复,不可存储。

2)在定义TreeSet集合时添加一个“比较器”
此时你需要自定义一个类实现Comparator接口,覆盖compare()方法,当构造TreeSet集合时把此比较器
传给TreeSet集合的构造函数,返回值的意义同上。

总结:自定义比较器的优点

当对象自身的比较器不适合你,而你有不能更改对象时,你可以自己再写一个符合要求的比较器,
这样即灵活又提高了程序的扩展性。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
    TreeSet对元素进行唯一性判断的方式是依靠元素本身具备的比较性或是传入TreeSet的比较器进行比较的,return 0 的话就代表元素重复了,就不在允许存入集合了啊,具体如果是元素本身就使其实现Comparable借口并覆写compareTo方法,或是是将一个Comparator接口的实例对象传给TreeSet集合的构造函数。
   除此之外,我觉得要总结集合各种关于唯一性的方式来对比记忆,比如,List接口的子类唯一性只是看equals()方法,hashSet类是先看hashCode值是否相同,再看equals()方法,而TreeSet唯一性的判定方式就是上面所说的了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马