黑马程序员技术交流社区

标题: 关于比较 [打印本页]

作者: 闲人    时间: 2014-4-3 12:31
标题: 关于比较
本帖最后由 闲人 于 2014-4-5 16:04 编辑

         * comparator
         * comparable
         * compare
         * compareTo
关于这四个,这两天写程序很容易就写混了,有没有能给我具体界定一下,如何区分这四个,什么时候该使用哪个?
还有就是,他们四个有什么关系,
谢谢了
作者: 霍振鹏    时间: 2014-4-4 17:34
Comparator是个接口(java.util包中的),它里面有两个方法:
compare(T o1,T o2)作用是比较用来排序的两个参数
equals方法

Comparable也是个接口(java.lang包中的)它只有一个方法:
compareTo(T o)比较此对象与指定对象的顺序




作者: 沫然    时间: 2014-4-4 19:32
1,comparable & Comparator都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义Comparator接口的方法compare()或在集合内实现Comparable接口的方法compareTo()。

(1),Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String    Integer自己就可以完成比较大小操作)

(2),而Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。

2,

(1),compareTo(Object o)方法是java.lang.Comparable<T>接口中的方法,当需要对某个类的对象进行排序时,该类需要实现Comparable<T>接口的,必须重写public int compareTo(T o)方法,比如MapReduce中Map函数和Reduce函数处理的 <key,value>,其中需要根据key对键值对进行排序,所以,key实现了WritableComparable<T>接口,实现这个接口可同时用于序列化和反序列化。WritableComparable<T>接口(用于序列化和反序列化)是Writable接口和Comparable<T>接口的组合;

(2),compare(Object o1,Object o2)方法是java.util.Comparator<T>接口的方法,它实际上用的是待比较对象的compareTo(Object o)方法。

作者: muma    时间: 2014-4-4 23:06
建议楼主亲自查看一下JDK API1.6
comparator接口就复写  compare方法
comparable接口就复写 compareTo方法

                       
作者: Peach2014    时间: 2014-4-5 00:54
本帖最后由 Peach2014 于 2014-4-5 01:09 编辑

comparator是一个比较器的接口,
自定义的比较类需要实现该接口中的
int compare(Object o1, Object o2);
可以简单理解为定义两个对象如何比较,从那个方面进行比较的规则。这里相当于是在外部传递比较规则。

comparable也是一个接口,
实体类实现该接口可以让类对象之间具备可比性,需要实现
int compareTo(T o);
实现该方法后,对象本身就具备自己特有比较性了,但是这里的比较方法无法在外部改变。

比如:
两个学生对象实体,是按照年龄比较排序(这里额可以理解为实现了comparable接口);自定义比较器中可以重新定义比较规则(例:按照姓名进行排序;这里则可以理解为定义了实现了comparator接口的实体类),然后将自定义的比较器传递给集合,实现新的比较性。

作者: 闲人    时间: 2014-4-5 16:03
沫然 发表于 2014-4-4 19:32
1,comparable & Comparator都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现的排序 ...

看了好多遍,就是没看懂
只是大概懂了他们之间的关系,但是什么情况下用哪个,还是晕呼呼的
不过还是感谢
作者: 闲人    时间: 2014-4-5 16:04
Peach2014 发表于 2014-4-5 00:54
comparator是一个比较器的接口,
自定义的比较类需要实现该接口中的
int compare(Object o1, Object o2);

略晕,谢谢了
作者: 沫然    时间: 2014-4-5 17:13
闲人 发表于 2014-4-5 16:03
看了好多遍,就是没看懂
只是大概懂了他们之间的关系,但是什么情况下用哪个,还是晕呼呼的
不过还是感谢 ...

晕没事 重要的是先会用就行 能写出来就好




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