Java集合排序之compareTo&compare 接口 compareable & comparator

来源:互联网 发布:黑客帝国4矩阵复活剧情 编辑:程序博客网 时间:2024/05/02 01:40

区别:

相同:comparable 和 Comparator 都是用来实现集合中的排序的(不是集合实现了这两接口,是集合里装的东西会去实现这两个接口)
区别:

Comparable是在集合内部定义的方法实现的排序
Comparator是在集合外部实现的排序

所以,如想实现排序,就需要在集合外定义Comparator接口的方法compare()或在集合内实现Comparable接口的方法compareTo()  

Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String Integer自己就可以完成比较大小操作)   
    
而Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。

 

其实很简单,单从字面理解就基本明白了。

Comparable,“可比较的”。

使用这种策略来比较时,两个对象本身必须是“可比较的”,比较的标准由对象所在的类定义,这种可比较的能力是对象本身固有的,因此不需要第三者参与就可以完成比较。compareTo()方法只要一个参数,因为这里只有“你”“我”的关系,没有第三者。

比如,两个人要比较身高,分辨高矮是人类固有的能力,两个人只要站到一起就能分出谁高谁矮。

Comparator,“比较器”。

使用这种策略来比较时,如何进行比较和两个对象本身无关,而是由第三者(即比较器)来完成的。只要实现Comparator接口,任何一个对象都可能成为一个“比较器”,但比较器并不是比较自己的实例,而是比较另外两个对象,比较器在这里充当“仲裁者”的角色,这也就是为什么compare()方法需要两个参数。

比如,两个人要比较谁智商更高,靠他们自身无法进行,这时要借助一个比较器(比如,智商测试题)。

 

不足和互补:

因为compareTo()方法约定:本对象大于另一个对象时,返回大于0的整数,小于时返回小于0的整数,等于时返回0。
但是,这种排序是非常不灵活的:

第一,需要修改集合元素类Employee,而很多情况下,我们没有办法修改公共的类。
第二,没有办法实现多种方式排序,如按编号,按姓名,按薪水等等。

这时需要使用另一种策略,即Comparator。Comparator使用其compare()方法返回的整数来比较两个对象,规则和compareTo()一样。

如同样实现年龄比较,使用Comparator时,无需修改Employee类,可以在排序的时候定义相应的比较器。

 

 

 

Java中compareTo和compare的区别

compareTo是Compareable接口的一个方法,主要用于规定创建对象的大小关系,该对象要实现compareable接口, 当a.compareTo(b)>0时,则a>b, 当a.compareTo(b)<0时, a<B.
compare方法是java.util中的Comparator接口的一个方法,compare方法内主要靠定义compareTo规定的对象大小关系来确定对象的大小。
———————————————————————————————————————————————————————————————
 java compare 降序/升序怎么确定
private class ComparatorList implements Comparator {
        public int compare(Object arg0, Object arg1) {
            ErpAccountCheckDetail cd1 = (ErpAccountCheckDetail)arg0;
            ErpAccountCheckDetail cd2 = (ErpAccountCheckDetail)arg1;
            return cd1.getCheckDate().compareTo(cd2.getCheckDate());
        }
    }
return cd1.getCheckDate().compareTo(cd2.getCheckDate());返回值是怎么确定升序降序的,返回值不是有可能为1,-1,0吗,是怎么确定升序或是降序的 

答:我印象中如果不重写compareTo方法那返回值都是-1吧......
我一般都是实现Comparable接口,重写CompareTo方法就可以了。
至于降序升序,可以这样比较:
假如A的值大于B,你返回1。这样调用Collections.sort()方法就是升序
假如A的值大于B,你返回-1。这样调用Collections.sort()方法就是降序
一般比较的都是对象中一个具体的数值。不知道你的类的构造,不好给例子
追问
cd1.getCheckDate().compareTo(cd2.getCheckDate())返回值不是一会1,一会-1吗,到底什么时候升序什么时候降序呢
回答
怎么会?你用System.out.println(cd1.getCheckDate().compareTo(cd2.getCheckDate()))打印出结果看的吗?
追问
结果每次不一样
回答
cd1.getCheckDate()
返回什么类型的值?Date还是String?
———————————————————————————————————————————————————————————————
接口API:
    *     * @param lhs     *            an {@code Object}.     * @param rhs     *            a second {@code Object} to compare with {@code lhs}.     * @return an integer < 0 if {@code lhs} is less than {@code rhs}, 0 if they are     *         equal, and > 0 if {@code lhs} is greater than {@code rhs}.     * @throws ClassCastException     *                if objects are not of the correct type.     */    public int compare(T lhs, T rhs);


0 0
原创粉丝点击