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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张建峰 初级黑马   /  2012-8-11 22:15  /  2300 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

关于Comparable与Comparator:
我知道:Comparator是一个接口,然后可以根据需要定义一个类来实现这个接口,成为比较器,在TreeSet或者TreeMap中传入比较器,就可以自己定义集合里面的排序
没有定义比较器的情况下,Tree集合的排序时在存储时调用的ComparaTo方法进行比较,然后存储
那么我们是不是也可以在自己的类里面定义一个ComparaTo方法来进行比较,排序呢?它和比较器有区别吗?

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
楼主的问题明显是java中集合中的两种排序方式:自然排序和定制排序

那么我们是不是也可以在自己的类里面定义一个ComparaTo方法来进行比较,排序呢?它和比较器有区别吗?

1.自然排序:java.lang.Comparable
Comparable 接口中只提供了一个方法: compareTo(Object obj) ,该方法的返回值是 int 。
如果返回值为正数,则表示当前对象(调用该方法的对象)比 obj 对象“大”;反之“小”;如果为零的话,则表示两对象相等
2.比较器排序:java.util.Comparator
有时需要对同一对象进行多种不同方式的排序,就要提供比较器排序接口,这点自然排序 Comparable 不能实现。
另外,Comparator 接口的一个好处是将比较排序算法和具体的实体类分离了。


定义一个ComparaTo方法,完成的依然是对数据本身进行比较,仍然是属于对象自身的自然排序
例如:集合中的String类型的数据,比较较基于String类型中自身各个字符的 Unicode 值进行比较
又比如你定义了一个学生类,类里面有name age,两个属性,你可以自定义ComparaTo方法,对这个学生类
中的对象按name或者age属性值进行比较排序,仍然是按照对象数据本身的可比性进行比较。所以属于自然排序


而Comparator是一个专用的比较器,当这个对象本身不具备可比性或者上面的ComparaTo方法无法满足你的要求时
你可以用Comparator来完成,它不是按对象自身的可比性进行排序的,而是根据你的需求定义一个外部程序
来完成比较。


总之一句话:Comparable是内部比较,而比较器Comparator是外部比较

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
可以,实现这个Comparator就是比较器了,这个的区别在于就是一个让类具有比较性,一个是让集合具有比较性,我的理解是,为什么会出现比较器这东东,原因就是当类的比较性性是不你不需要的,这时候不能修改人家的代码,就是人家的比较方法,出现比较器来覆盖原来的比较方法,应该是这样。
大哥啊,我都差点让你整晕,辛亏看了下

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 赞一个!

查看全部评分

回复 使用道具 举报
焦晨光 发表于 2012-8-11 22:38
楼主的问题明显是java中集合中的两种排序方式:自然排序和定制排序

那么我们是不是也可以在自己的类里面定 ...

不愧是30分,回答的比我完整多,健全了,我本来是想打算看下你有没被楼主误导呢,呵呵 ,服了
回复 使用道具 举报
朱烈葵 发表于 2012-8-11 22:47
不愧是30分,回答的比我完整多,健全了,我本来是想打算看下你有没被楼主误导呢,呵呵 ,服了 ...

嘿嘿 ,我也是遇到问题后,要不停地看书查资料,然后总结,在论坛上学到了很多细节问题,呵呵。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马