黑马程序员技术交流社区

标题: 集合(TreeSet,TreeMap)中的排序问题 [打印本页]

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


作者: 焦晨光    时间: 2012-8-11 22:38
楼主的问题明显是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是外部比较

作者: 朱烈葵    时间: 2012-8-11 22:41
可以,实现这个Comparator就是比较器了,这个的区别在于就是一个让类具有比较性,一个是让集合具有比较性,我的理解是,为什么会出现比较器这东东,原因就是当类的比较性性是不你不需要的,这时候不能修改人家的代码,就是人家的比较方法,出现比较器来覆盖原来的比较方法,应该是这样。
大哥啊,我都差点让你整晕,辛亏看了下
作者: 朱烈葵    时间: 2012-8-11 22:47
焦晨光 发表于 2012-8-11 22:38
楼主的问题明显是java中集合中的两种排序方式:自然排序和定制排序

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

不愧是30分,回答的比我完整多,健全了,我本来是想打算看下你有没被楼主误导呢,呵呵 ,服了
作者: 焦晨光    时间: 2012-8-11 23:02
朱烈葵 发表于 2012-8-11 22:47
不愧是30分,回答的比我完整多,健全了,我本来是想打算看下你有没被楼主误导呢,呵呵 ,服了 ...

嘿嘿 ,我也是遇到问题后,要不停地看书查资料,然后总结,在论坛上学到了很多细节问题,呵呵。。。




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