Java中比较对象的两个接口Comparable接口和Comparator接口

jdk文档是这样介绍的数据结构

1.  public interface  Comparable<T>:此接口强行对实现它的每一个类的对象进行总体排序,也就是所谓的天然排序。它的compareTo方法被称为天然比较方法。ide

Collections.sort(List<Clazz>)这个Clazz实现了Comparable接口函数

2. public interface Comparator<T>:强行对某个对象collection进行总体排序的比较函数。能够将Comparator传递给sort方法,也能够使用它来控制某些数据结构的顺序,或者为那些没有天然顺序的对象collection提供排序,重写compare方法。ui

Collections.sort(List<Clazz>,clazz)clazz实现了Comparator接口spa

我以为使用Comparator 比使用Comparable更灵活一点吧。对象

第一种方式实现Comparable排序

@Override
public int compareTo(ConsumInfo o) {
    if(price < o.price){
        return -1;
    }
    if (price > o.price){
        return 1;
    }
    if(price == o.price){
        if (uid < o.uid){
            return -1;
        }
        if (uid > o.uid){
            return 1;
        }
    }
    return 0;
}

test类接口

public static void main(String[] args) {
    ConsumInfo consumInfo1 = new ConsumInfo(100, "consumInfo1", 400.0,new Date());
    ConsumInfo consumInfo2 = new ConsumInfo(200, "consumInfo1", 200.0,new Date());
    ConsumInfo consumInfo3 = new ConsumInfo(300, "consumInfo1", 100.0,new Date());
    ConsumInfo consumInfo4 = new ConsumInfo(400, "consumInfo1", 700.0,new Date());
    ConsumInfo consumInfo5 = new ConsumInfo(500, "consumInfo1", 800.0,new Date());
    ConsumInfo consumInfo6 = new ConsumInfo(600, "consumInfo1", 300.0,new Date());
    ConsumInfo consumInfo7 = new ConsumInfo(700, "consumInfo1", 900.0,new Date());
    ConsumInfo consumInfo8 = new ConsumInfo(800, "consumInfo1", 400.0,new Date());
    List<ConsumInfo> list = new ArrayList<ConsumInfo>();
    list.add(consumInfo1);
    list.add(consumInfo2);
    list.add(consumInfo3);
    list.add(consumInfo4);
    list.add(consumInfo5);
    list.add(consumInfo6);
    list.add(consumInfo7);
    list.add(consumInfo8);
    System.out.println("排序前:");
    for (ConsumInfo consumInfo : list){
        System.out.println(consumInfo);
    }

    Collections.sort(list);
    System.out.println("排序后:");
    for (Comparable comparable : list){
        System.out.println(comparable);
    }
}

结果是:文档

排序前:
ConsumInfo{uid=100, name='consumInfo1', price=400.0, datetime=Sun Aug 26 22:24:23 CST 2018}
ConsumInfo{uid=200, name='consumInfo1', price=200.0, datetime=Sun Aug 26 22:24:23 CST 2018}
ConsumInfo{uid=300, name='consumInfo1', price=100.0, datetime=Sun Aug 26 22:24:23 CST 2018}
ConsumInfo{uid=400, name='consumInfo1', price=700.0, datetime=Sun Aug 26 22:24:23 CST 2018}
ConsumInfo{uid=500, name='consumInfo1', price=800.0, datetime=Sun Aug 26 22:24:23 CST 2018}
ConsumInfo{uid=600, name='consumInfo1', price=300.0, datetime=Sun Aug 26 22:24:23 CST 2018}
ConsumInfo{uid=700, name='consumInfo1', price=900.0, datetime=Sun Aug 26 22:24:23 CST 2018}
ConsumInfo{uid=800, name='consumInfo1', price=400.0, datetime=Sun Aug 26 22:24:23 CST 2018}
排序后:
ConsumInfo{uid=300, name='consumInfo1', price=100.0, datetime=Sun Aug 26 22:24:23 CST 2018}
ConsumInfo{uid=200, name='consumInfo1', price=200.0, datetime=Sun Aug 26 22:24:23 CST 2018}
ConsumInfo{uid=600, name='consumInfo1', price=300.0, datetime=Sun Aug 26 22:24:23 CST 2018}
ConsumInfo{uid=100, name='consumInfo1', price=400.0, datetime=Sun Aug 26 22:24:23 CST 2018}
ConsumInfo{uid=800, name='consumInfo1', price=400.0, datetime=Sun Aug 26 22:24:23 CST 2018}
ConsumInfo{uid=400, name='consumInfo1', price=700.0, datetime=Sun Aug 26 22:24:23 CST 2018}
ConsumInfo{uid=500, name='consumInfo1', price=800.0, datetime=Sun Aug 26 22:24:23 CST 2018}
ConsumInfo{uid=700, name='consumInfo1', price=900.0, datetime=Sun Aug 26 22:24:23 CST 2018}get

第二种方式,实现Comparator

public class ConsumIfoComapratorClass implements Comparator<ConsumIfoComparator> {

    @Override
    public int compare(ConsumIfoComparator o1, ConsumIfoComparator o2) {
       if (o1.getPrice() < o2.getPrice()){
           return -1;
       }
       if (o1.getPrice() > o2.getPrice()){
           return 1;
       }
       if(o1.getPrice() == o2.getPrice()){
           if(o1.getUid() < o2.getUid()){
               return -1;
           }
           if(o1.getUid() > o2.getUid()){
               return 1;
           }
       }
       return 0;
    }
}

test类

实体类ConsumIfoComparator 没有实现别的排序接口

public static void main(String[] args) {
    ConsumIfoComparator consumInfo1 = new ConsumIfoComparator(100, "consumInfo1", 400.0,new Date());
    ConsumIfoComparator consumInfo2 = new ConsumIfoComparator(200, "consumInfo1", 200.0,new Date());
    ConsumIfoComparator consumInfo3 = new ConsumIfoComparator(300, "consumInfo1", 100.0,new Date());
    ConsumIfoComparator consumInfo4 = new ConsumIfoComparator(400, "consumInfo1", 700.0,new Date());
    ConsumIfoComparator consumInfo5 = new ConsumIfoComparator(500, "consumInfo1", 800.0,new Date());
    ConsumIfoComparator consumInfo6 = new ConsumIfoComparator(600, "consumInfo1", 300.0,new Date());
    ConsumIfoComparator consumInfo7 = new ConsumIfoComparator(700, "consumInfo1", 900.0,new Date());
    ConsumIfoComparator consumInfo8 = new ConsumIfoComparator(800, "consumInfo1", 400.0,new Date());

    List<ConsumIfoComparator> list = new ArrayList<ConsumIfoComparator>();
    list.add(consumInfo1);
    list.add(consumInfo2);
    list.add(consumInfo3);
    list.add(consumInfo4);
    list.add(consumInfo5);
    list.add(consumInfo6);
    list.add(consumInfo7);
    list.add(consumInfo8);
    
    System.out.println("排序前:");
    for (ConsumIfoComparator consumIfoComparator : list){
        System.out.println(consumIfoComparator);
    }
    ConsumIfoComapratorClass consumIfoComapratorClass = new ConsumIfoComapratorClass();//比较器
    Collections.sort(list,consumIfoComapratorClass);
    System.out.println("排序后:");
    for (ConsumIfoComparator consumIfoComparator : list){
        System.out.println(consumIfoComparator);
    }
}

结果是:

排序前:
ConsumIfoComparator{uid=100, name='consumInfo1', price=400.0, datetime=Sun Aug 26 22:26:38 CST 2018}
ConsumIfoComparator{uid=200, name='consumInfo1', price=200.0, datetime=Sun Aug 26 22:26:38 CST 2018}
ConsumIfoComparator{uid=300, name='consumInfo1', price=100.0, datetime=Sun Aug 26 22:26:38 CST 2018}
ConsumIfoComparator{uid=400, name='consumInfo1', price=700.0, datetime=Sun Aug 26 22:26:38 CST 2018}
ConsumIfoComparator{uid=500, name='consumInfo1', price=800.0, datetime=Sun Aug 26 22:26:38 CST 2018}
ConsumIfoComparator{uid=600, name='consumInfo1', price=300.0, datetime=Sun Aug 26 22:26:38 CST 2018}
ConsumIfoComparator{uid=700, name='consumInfo1', price=900.0, datetime=Sun Aug 26 22:26:38 CST 2018}
ConsumIfoComparator{uid=800, name='consumInfo1', price=400.0, datetime=Sun Aug 26 22:26:38 CST 2018}
排序后:
ConsumIfoComparator{uid=300, name='consumInfo1', price=100.0, datetime=Sun Aug 26 22:26:38 CST 2018}
ConsumIfoComparator{uid=200, name='consumInfo1', price=200.0, datetime=Sun Aug 26 22:26:38 CST 2018}
ConsumIfoComparator{uid=600, name='consumInfo1', price=300.0, datetime=Sun Aug 26 22:26:38 CST 2018}
ConsumIfoComparator{uid=100, name='consumInfo1', price=400.0, datetime=Sun Aug 26 22:26:38 CST 2018}
ConsumIfoComparator{uid=800, name='consumInfo1', price=400.0, datetime=Sun Aug 26 22:26:38 CST 2018}
ConsumIfoComparator{uid=400, name='consumInfo1', price=700.0, datetime=Sun Aug 26 22:26:38 CST 2018}
ConsumIfoComparator{uid=500, name='consumInfo1', price=800.0, datetime=Sun Aug 26 22:26:38 CST 2018}
ConsumIfoComparator{uid=700, name='consumInfo1', price=900.0, datetime=Sun Aug 26 22:26:38 CST 2018}

总结一下:实现Comparable接口的类须要重写CompareTo()方法,实现了这个接口的类就能够实现排序了。也就是说该类的对象是一个可比较的对象,可是也须要修改源码。Collections.sort(list);

而实现了Comparator 接口的类须要重写compare()方法,实现这个接口不须要修改源码而是须要写一个比较器传入须要比较的对象,经过编写着本身实现比较的规则,这就能够本身定义更加复杂的规则了。Collections.sort(list,consumIfoComapratorClass);

相关文章
相关标签/搜索