Java比较器

Posted 巧克力爱王子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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));
    

以上是关于Java比较器的主要内容,如果未能解决你的问题,请参考以下文章

Java比较器

java 在java 8中排序比较器

Day029 Java比较器

java 日期怎么比较大小?

java 中字符串 怎么比较大小

java对象的比较