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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈腾跃_2013 中级黑马   /  2013-3-14 21:13  /  1499 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈腾跃_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”方法。

我有点乱和疑惑,这四个(红色标注)之间到底是什么关系?功能上有什么分工或差异吗?



评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

2 个回复

倒序浏览
Person实现了“comparable”且复写了“ compareTo”不是已经具备比较性了吗?
为什么TreeSet的构造函数中还传入一个自定义“Comparator”的子类,且其中有“ compare”方法。

我有点乱和疑惑,这四个(红色标注)之间到底是什么关系?功能上有什么分工或差异吗?

拿你的Person类来说,Person实现了“comparable”且复写了“ compareTo”使得Person类具备的比较性称为自然顺序,比如你覆写compareTo方法,里面的顺序比较是以年龄,但是如果以后的使用中要求使用Person类的其他属性作为比较依据,就必须使用Comparator了,因为你不可能去修改Person类实现的Comperable接口的compareTo方法,那样是“灾难性的”。



评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
其实你完全可以不让Person实现Compareable接口 仅仅自定义比较器 实现Comparator 就可以实现你想要的排序 你为何试一试呢?

相信代码就不必贴了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马