黑马程序员技术交流社区
标题:
TreeSet中的比较器问题
[打印本页]
作者:
陈腾跃_2013
时间:
2013-3-14 21:13
标题:
TreeSet中的比较器问题
本帖最后由 陈腾跃_2013 于 2013-3-15 09:11 编辑
有点乱,在此请教
有一个person类
class Person implements
comparable
//实现comparable
{
private String name;
private int age;
public int
compareTo
(Object obj) //复写compareTo
{
……………………//省略
}
……………………//省略构造函数,属性方法等
}
class Demo
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet(new MyCompare); //传入Comparator的子对象
ts.add(new Person("name01",22));
ts.add(new Person("name02",23));
……………………//省略添加对象
……………………//省略输出
}
}
class MyCompare implements
Comparator
{
public int
compare
(Object 01, Object 02)
{
……………………//省略比较条件
}
}
我知道,传入TreeSet中的对象需要具备比较性。
Person实现了“
comparable
”且复写了“
compareTo
”不是已经具备比较性了吗?
为什么TreeSet的构造函数中还传入一个自定义“
Comparator
”的子类,且其中有“
compare
”方法。
我有点乱和疑惑,这四个(红色标注)之间到底是什么关系?功能上有什么分工或差异吗?
作者:
范天成
时间:
2013-3-14 22:11
Person实现了“comparable”且复写了“ compareTo”不是已经具备比较性了吗?
为什么TreeSet的构造函数中还传入一个自定义“Comparator”的子类,且其中有“ compare”方法。
我有点乱和疑惑,这四个(红色标注)之间到底是什么关系?功能上有什么分工或差异吗?
拿你的Person类来说,Person实现了“comparable”且复写了“ compareTo”使得Person类具备的比较性称为自然顺序,比如你覆写compareTo方法,里面的顺序比较是以年龄,但是如果以后的使用中要求使用Person类的其他属性作为比较依据,就必须使用Comparator了,因为你不可能去修改Person类实现的Comperable接口的compareTo方法,那样是“灾难性的”。
作者:
杨玉辉
时间:
2013-3-15 00:26
其实你完全可以不让Person实现Compareable接口 仅仅自定义比较器 实现Comparator 就可以实现你想要的排序 你为何试一试呢?
相信代码就不必贴了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2