黑马程序员技术交流社区

标题: TreeSet中自定义对象的比较问题 [打印本页]

作者: 刘云龙    时间: 2013-3-19 20:16
标题: TreeSet中自定义对象的比较问题
本帖最后由 刘云龙 于 2013-3-20 12:27 编辑

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

作者: 郝强勇    时间: 2013-3-19 20:23
这个问题就是比较方式的优先级问题,首先说TreeSet只是容器,本身没有比较性而言,其比较性源于元素本身比较性和第三方比较器(也就是我们定义的实现Comparetor接口的实例对象),当对象自身的比较性和比较器定义的比较性冲突时,以比较器的比较性为主。
作者: 赵晓东    时间: 2013-3-19 20:30
我记得老毕说的是有比较器先按比较器来,没比较器按元素实现comparable的方法(元素的自然排序)来,好像是比较器优先吧
作者: 王军行    时间: 2013-3-19 20:36
TreeSet可以对set集合元素进行排序
底层数据结构是二叉树
保证唯一性的方法是
第一种方式:元素的compareTo方法
TreeSet实现排序的第一种方法是让元素自身具备比较性
实现Comparable覆盖compareTo方法
第二种排序方式:
当元素自身不具备比较性,或者自身比较性不是所需要的时让集合自身具备比较性,
就是在集合初始化时具备比较方式,
定义比较器,将比较器对象作为参数传递给TreeSte构造函数
比较器定义方法:
定义一个比较器类实现Comparator覆盖compare方法注意是传入两个参数的compare方法不是compareTo

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


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


作者: 刘云龙    时间: 2013-3-20 12:34
嗯,谢谢各位解答.
首先考虑的是TreeSet通过构造函数传过来的comparator接口的子类对象,
然后再考虑元素的compareTo方法.
但是,TreeSet调用comparator接口,具体内部是怎么实现的,还是不太清楚.
还有,comparator的子类实现,应该是作为TreeSet的一个成员,
那么,TreeSet又是如何调用和使用这个comparator子类的呢?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2