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

jdk文档是这样介绍的

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

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

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

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

我觉得使用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}

第二种方式,实现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);

 

转载于:https://my.oschina.net/u/3738404/blog/1934281

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值