Java比较器

概述

比较器在Java中对象的比较只能使用 == 或 != 比较地址值异同。或者重写equals方法比较内容。 但是,无法使用 < > 运算符比较对象大小。
Java开发中涉及对象的排序比较问题就需要使用到接口 comparable 或 comparator 。

comparable 接口

comparable接口的使用举例 (comparTo()方法) 自然排序
1、String、包装类实现了comparable接口,重写了comparTo()方法。给出了两个对象比较大小的方式
2、String、包装类实现了comparable接口,重写了comparTo()方法,实现从小到大的排序
若对对象数组进行排序则需要重写comparTo()方法后使用Arrays工具类sort()
3、重写ComparTO()方法的规则:
如果当前对象的this大于形参对象obj,返回正整数。反之,返回负数;相等返回0
4、对于自定义类,要想实现排序。可以人自定义类实现comparable接口,重写comparTo()方法
在comparTo()方法中实现排序方式

public class Goods implements Comparable{
    private String name;
    private double parive;

    public Goods() {
    }

    public Goods(String name, double parive) {
        this.name = name;
        this.parive = parive;
    }

  
    //指明比较大小的方式 :按商品价格升序排列,在按照商品名称排序
    @Override
    public int compareTo(Object o) {
        if (o instanceof Goods) {
//     方式一:
            Goods o1 = (Goods) o;
            if (this.parive > o1.parive) {
                return 1;
            } else if (this.parive < o1.parive) {
                return -1;
            } else {
//                return 0;
                return this.name.compareTo(o1.name);  //name为String 类已重写ComparTo()
            }
//     方式二:  return Double.compare(this.parive,o1.parive);
        }
        throw new  RuntimeException("输入数据有误");
    }

    public double getParive() {
        return parive;
    }

    public void setParive(double parive) {
        this.parive = parive;
    }

    public String getName() {
        return name;
    }

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

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

   @Test
    public void Test01(){
        String[] strings = {"aa", "ll", "oo", "qq", "bb"};
        Arrays.sort(strings);
        System.out.println(Arrays.toString(strings));
    }
    @Test
    public void Test02(){
       Goods[] are= new Goods[5];
       are[0]=new Goods("caotianqi1",250);
       are[1]=new Goods("lianxiang",299);
       are[2]=new Goods("omen",204);
       are[3]=new Goods("epic",555);
       are[4]=new Goods("fsd",555);

       Arrays.sort(are);
       System.out.println(Arrays.toString(are));
    }

comparator

Comparator 接口的使用 定制排序
1、当类中没有实现comparable接口,且不方便更改代码时,
或者实现comparable接口的排序规则不适合当前操作
可以考虑使用comparator对象来进行排序
2、重写compare(Object o1,Object o2)方法,比较o1和o2的大小
返回正数 o1>o2
返回负数 o1<o2
相等 返回 0

public void Test03(){
        String[] strings = {"qq","ww","ee","rr","tt"};
//        定制排序 降序
        Arrays.sort(strings, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return  -o1.compareTo(o2);
            }
        });
        System.out.println(Arrays.toString(strings));
    }
    @Test
    public void Test04(){
        Goods[] are= new Goods[6];
        are[0]=new Goods("caotianqi1",250);
        are[1]=new Goods("lianxiang",299);
        are[2]=new Goods("omen",204);
        are[3]=new Goods("epic",555);
        are[4]=new Goods("fsd",555);
        are[5]=new Goods("fsd",55);
//        方式一:按照自定义类中的comparTo()排序规则
//        Arrays.sort(are, new Comparator<Goods>() {
//            @Override
//            public int compare(Goods o1, Goods o2) {
//                return -o1.compareTo(o2);
//            }
//        });
//        方式二:自定义排序规则 :商品名称升序(降序)-价格降序(升序)
        Arrays.sort(are, new Comparator<Goods>() {
            @Override
            public int compare(Goods o1, Goods o2) {
                if (o1.getName().equals(o2.getName())){
                    return -Double.compare(o1.getParive(),o2.getParive());
                }else {
                    return o1.getName().compareTo(o2.getName());
                }
            }
        });
        System.out.println(Arrays.toString(are));
    }
}

comparable 和comparator 异同

comparable接口comparTo()方法在类中定义(任意时刻都可以调用比较)comparator接口compare() 使用时定义(临时性的比较)。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值