黑马程序员技术交流社区

标题: 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