自然排序(Comparable)与定制排序(Comparator)对比

1.自定义类

public class Goods implements Comparable{
    String name;
    Integer price;

    public Goods(String name, Integer price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Goods{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }

    @Override
    public int compareTo(Object o) {
        if(o instanceof Goods) {
            Goods goods = (Goods) o;
            if(this.getPrice() > goods.getPrice()) {
                return 1;
            }else if(this.getPrice() < goods.getPrice()) {
                return -1;

            }else {
                //return 0;
                return this.getName().compareTo(goods.getName());
            }
         }
        throw new RuntimeException("传参不一致!");
    }
}

2.测试

1.自然排序

    public static void main(String[] args) {
        Goods[] arr = new Goods[4];
        arr[0] = new Goods("xiaomi", 90);
        arr[1] = new Goods("apple", 900);
        arr[2] = new Goods("huawei", 400);
        arr[3] = new Goods("oppo", 90);
        Arrays.sort(arr);//自然排序
        System.out.println("自然排序:" + Arrays.toString(arr));
    }

输出:
在这里插入图片描述
说明:
自然排序需要自定义类去实现了Comparable接口中的compareTo方法。调用Arrays.sort进行排序时,该sort方法会默认去调用自定义类中的compareTo,根据compareTo方法中定义的规则(如:根据price进行降序或升序)进行排序。为了作区分,这里实现了按price升序。

2. 定制排序

    public static void main(String[] args) {
        Goods[] arr = new Goods[4];
        arr[0] = new Goods("xiaomi", 90);
        arr[1] = new Goods("apple", 900);
        arr[2] = new Goods("huawei", 400);
        arr[3] = new Goods("oppo", 90);

        Arrays.sort(arr,  (o1, o2) -> o2.getPrice() - o1.getPrice() );
        System.out.println("定制排序:" + Arrays.toString(arr));
    }

输出:
在这里插入图片描述
说明:
定制排序,需要在调用Arrays.sort方法时,需要在参数二的位置传入Comparator对象,实现Comparator中的compare方法,这里我们使用了Lambda表达式的写法来代替函数式接口Comparator。这种排序方式,相当于给Arrays.sort方法定制了一个临时的排序规则。

3.总结

个人认为:自然排序(Comparable)是针对于元素(类)的,即在待排序元素内部定义了一个排序规则,在调用排序方法时会默认根据待排序元素的这一内部规则来排序。
定制排序(Comparator)是针对(用于排序的)排序方法的,在排序方法的某个参数入口传入临时定义的排序规则,来对待排序元素进行排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值