Java比较器

Java 实现对象排序的方式有两种:
①  自然排序: java.lang.Comparable
② 定制排序: java.util.Comparator
方式一:自然排序: java.lang.Comparable
Comparable 接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序。
实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即通过 compareTo(Object
obj) 方法的返回值来比较大小。 如果当前对象 this 大于形参对象obj ,则返回正整数,如果当前对象
this 小于形参对象 obj ,则返回负整数,如果当前对象this 等于形参对象 obj ,则返回零。
实现 Comparable 接口的对象列表(和数组)可以通过 Collections.sort 或Arrays.sort进行自动排
序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
对于类 C 的每一个 e1 e2 来说,当且仅当 e1.compareTo(e2) == 0 与e1.equals(e2) 具有相同的
boolean 值时,类 C 的自然排序才叫做与 equals一致。建议(虽然不是必需的) 最好使自然排序
equals 一致
Comparable 的典型实现 ( 默认都是从小到大排列的 )
String :按照字符串中字符的 Unicode 值进行比较
Character :按照字符的 Unicode 值来进行比较
数值类型对应的包装类以及 BigInteger BigDecimal :按照它们对应的数值大小进行比较
Boolean true 对应的包装类实例大于 false 对应的包装类实例
Date Time 等:后面的日期时间比前面的日期时间大
//在实现了Comparable接口的类Goods中重写的compareTo方法
   @Override
    public int compareTo(Object o) {
        if(o instanceof Goods){
            Goods goods = (Goods) o;
            if(this.price > goods.price){
                return 1;
            }else if(this.price < goods.price){
                return -1;
            }else{
               return this.name.compareTo(goods.name);
            }
//           return Double.compare(this.price,goods.price);
        }
       throw new RuntimeException("输入类型不对");
    }
 /*
    实现comparable接口测试
     */
    @Test
    public void test1(){
        Goods[] goods= new Goods[5];
        goods[0] = new Goods("lenovo",45);
        goods[1] = new Goods("Xiaomi",20);
        goods[2] = new Goods("Huawei",45);
        goods[3] = new Goods("Dell",60);
        goods[4] = new Goods("logi",40);

        Arrays.sort(goods);
        System.out.println(Arrays.toString(goods));

    }

方式二:定制排序: java.util.Comparator
当元素的类型没有实现 java.lang.Comparable 接口而又不方便修改代码, 或者实现了
java.lang.Comparable 接口的排序规则不适合当前的操作,那 么可以考虑使用 Comparator 的对
象来排序 ,强行对多个对象进行整体排序的比较。
重写 compare(Object o1,Object o2) 方法,比较 o1 o2 的大小: 如果方法返 回正整数,则表示 o1
o2 ;如果返回 0 ,表示相等;返回负整数,表示 o1 小于 o2
可以将 Comparator 传递给 sort 方法(如 Collections.sort Arrays.sort ),从而允许在排序顺序
上实现精确控制。
还可以使用 Comparator 来控制某些数据结构(如有序 set 或有序映射)的顺序,或者为那些没有
自然顺序的对象 collection 提供排序。
  /*
    comparator类 实现定制排序
     */
    @Test
    public void test2(){
        String[] arr = new String[]{"aa","ff","cc","ee","zz","mm"};

        Arrays.sort(arr, new Comparator(){

            @Override
            public int compare(Object o1, Object o2) {
                if (o1 instanceof String && o1 instanceof String){
                    String s1 = (String) o1;
                    String s2 = (String) o2;
                    return -s1.compareTo(s2);
                }
//                return 0;
                throw new RuntimeException("输入类型不对");

            }
        });

        System.out.println(Arrays.toString(arr));
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值