java中的Comparable 和Comparator

我将从背景和使用两个方面去讲述

1.Comparable(自然排序)

首先讲一下Comparable的作用,有时候,我们需要对对象进行排序,比如说对商城中所有的手机价格按高到低进行展示。

我们使用Arrays.sort(arr[])对字符串或者Integer进行排序没有做任何操作,这又是为什么呢?这是因为他们都实现了Comparable接口。

接下来如果我们实现了这样的接口,但是如何进行排序呢,或者说按照什么规则进行排序,我们需要在实现compareTo抽象方法,抽象方法代码实现如下:

@Override
public int compareTo(ComparableTest o) {
    if(o==this){
        return 0;
    }
    if(o instanceof ComparableTest){
        ComparableTest pro = (ComparableTest) o;
        int value= Double.compare(this.price,pro.price);
        if(value!=0){
            return value;
        }
        return this.name.compareTo(pro.name);
    }

    throw new RuntimeException("类型比较异常");
}

这里的返回类型是int,如果返回值大于0,那么当前对象大,如果返回值等于0,那么两个对象相等。如果返回值小于0,那么后面的对象大。基本的思路就是首先判断一下两个对象的地址是否相等,如果相等直接返回0。这一步我认为是减枝操作。接下来,判断一下是否是当前类型的对象,这里是Product,然后在这里面定义规则,比如说按照价格排序,或者如果价格相同,按照名称排序。如果不是product对象,则直接抛出异常。

2.Comparator(定制排序)

首先讲一下为什么会引入Comparator,这里有两种场景,可能需要使用Comparator.

1.有一些第三方类,无法进行修改源代码

2.实现了comparable接口,但是这种排序方式并不符合我们的需求,我们需要另外定义排序规则进行排序。

讲一下如何使用这个Comparator,下图为定制排序的代码:

public static void main(String[] args) {
    ComparatorTest[] arr = new ComparatorTest[5];

    arr[0] = new ComparatorTest("huawei",4776);
    arr[1] = new ComparatorTest("xiaomi",4732);
    arr[2] = new ComparatorTest("nuojiya",5435);
    arr[3] = new ComparatorTest("appo",5435);
    arr[4] = new ComparatorTest("vivo",4633);

    Comparator<ComparatorTest> comparator = new Comparator<ComparatorTest>() {
        @Override
        public int compare(ComparatorTest o1, ComparatorTest o2) {
            if((o1 instanceof ComparatorTest) && (o2 instanceof ComparatorTest) ){
                ComparatorTest c1 = (ComparatorTest) o1;
                ComparatorTest c2 = (ComparatorTest) o2;
                return Double.compare(c1.price,c2.price);
            }
            throw new RuntimeException("类型比较异常");
        }
    };
    Arrays.sort(arr, comparator);
    for(ComparatorTest pro:arr){
        System.out.println("pro.name = " + pro.name+"pro.price"+pro.price);
    }
}

就是定义一套规则,将这个对象以参数的形式传递参数。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值