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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘云龙 中级黑马   /  2013-3-19 20:16  /  1470 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘云龙 于 2013-3-20 12:27 编辑

如果自定义类实现了Comparable接口,TreeSet对象也具有比较性,那么当把自定义类添加到TreeSet对象中,并遍历时,结果会依据TreeSet类接收的Comparator子类中实现的compare()方法,还是自定义类中的compareTo()方法?

点评

再次提醒:如果你的问题已经得到解决,请及时将主题改为[已解决],如果还有问题请继续追问,谢谢  发表于 2013-3-20 12:05
如果问题未解决,请继续追问回复者,如果问题已经解决,请将分类改为“已解决”,谢谢  发表于 2013-3-19 23:07

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

6 个回复

倒序浏览
这个问题就是比较方式的优先级问题,首先说TreeSet只是容器,本身没有比较性而言,其比较性源于元素本身比较性和第三方比较器(也就是我们定义的实现Comparetor接口的实例对象),当对象自身的比较性和比较器定义的比较性冲突时,以比较器的比较性为主。

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
我记得老毕说的是有比较器先按比较器来,没比较器按元素实现comparable的方法(元素的自然排序)来,好像是比较器优先吧
回复 使用道具 举报
TreeSet可以对set集合元素进行排序
底层数据结构是二叉树
保证唯一性的方法是
第一种方式:元素的compareTo方法
TreeSet实现排序的第一种方法是让元素自身具备比较性
实现Comparable覆盖compareTo方法
第二种排序方式:
当元素自身不具备比较性,或者自身比较性不是所需要的时让集合自身具备比较性,
就是在集合初始化时具备比较方式,
定义比较器,将比较器对象作为参数传递给TreeSte构造函数
比较器定义方法:
定义一个比较器类实现Comparator覆盖compare方法注意是传入两个参数的compare方法不是compareTo

当两种排序都存在以比较器为主。
就是比较器优先

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
以比较器为主。
我们都知道有两种方式实现比较性,一种是自定义实现Comparable接口,另一种是自定义比较器Comparator子类作为形参传入构造函数。
我们要知道第二种设立的意义主要是为了应对两种情况:
1、容器元素不具备比较性(显然,这个与文中情况不符合
2、容器元素比较标准不是我们想要的,换言之,就是把我们想要的比较标准定义在比较器中,再传入容器,如此一来,自然是比较器优先性高于元素中定义比较性,否则这种定义就失去了意义。

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
以比较器为主。
我们都知道有两种方式实现比较性,一种是自定义实现Comparable接口,另一种是自定义比较器Comparator子类作为形参传入构造函数。
我们要知道第二种设立的意义主要是为了应对两种情况:
1、容器元素不具备比较性(显然,这个与文中情况不符合
2、容器元素比较标准不是我们想要的,换言之,就是把我们想要的比较标准定义在比较器中,再传入容器,如此一来,自然是比较器优先性高于元素中定义比较性,否则这种定义就失去了意义。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
嗯,谢谢各位解答.
首先考虑的是TreeSet通过构造函数传过来的comparator接口的子类对象,
然后再考虑元素的compareTo方法.
但是,TreeSet调用comparator接口,具体内部是怎么实现的,还是不太清楚.
还有,comparator的子类实现,应该是作为TreeSet的一个成员,
那么,TreeSet又是如何调用和使用这个comparator子类的呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马