zoukankan      html  css  js  c++  java
  • JavaSE--Comparator 和 Comparable 区别

    public interface Comparable<T>
    
    

    此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法

    实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器

    public interface Comparator<T>
    
    

    强行对某个对象 collection 进行整体排序 的比较函数。可以将 Comparator 传递给 sort 方法(如 Collections.sortArrays.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序 set有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。

    区别:简单的说就是 Comparable 的实现使得类可以排序,而 Comparator 的应用场景是需要排序的类本身并没有实现 Comparator 接口,这时候调用 Arrays 的 sort方法则需要传入一个比较器,一般传入一个匿名局部内部类。

    1 package org.wzh.compare2;
    2 
    3 public interface Animal {
    4     
    5     int getAge();
    6 
    7 }
     1 package org.wzh.compare2;
     2 
     3 public class Cat implements Animal {
     4 
     5     private String name;
     6     private int age;
     7 
     8     public Cat() {
     9     }
    10 
    11     public Cat(String name, int age) {
    12         super();
    13         this.name = name;
    14         this.age = age;
    15     }
    16 
    17     public String getName() {
    18         return name;
    19     }
    20 
    21     public void setName(String name) {
    22         this.name = name;
    23     }
    24 
    25     public int getAge() {
    26         return age;
    27     }
    28 
    29     public void setAge(int age) {
    30         this.age = age;
    31     }
    32 
    33     @Override
    34     public String toString() {
    35         return "Cat [name=" + name + ", age=" + age + "]";
    36     }
    37 
    38 }
     1 package org.wzh.compare2;
     2 
     3 public class Dog implements Animal {
     4 
     5     private String name;
     6     private int age;
     7 
     8     public Dog() {
     9     }
    10 
    11     public Dog(String name, int age) {
    12         super();
    13         this.name = name;
    14         this.age = age;
    15     }
    16 
    17     public String getName() {
    18         return name;
    19     }
    20 
    21     public void setName(String name) {
    22         this.name = name;
    23     }
    24 
    25     public int getAge() {
    26         return age;
    27     }
    28 
    29     public void setAge(int age) {
    30         this.age = age;
    31     }
    32 
    33     @Override
    34     public String toString() {
    35         return "Dog [name=" + name + ", age=" + age + "]";
    36     }
    37 
    38 
    39 }
    package org.wzh.compare2;
    
    import java.util.Arrays;
    import java.util.Comparator;
    
    public class TestCompare {
        
        public static void main(String[] args) {
            Dog dog = new Dog("Shrek", 17);
            Cat cat = new Cat("Tom", 12);
            Animal[] animals = new Animal[]{dog, cat};
            System.out.println(Arrays.toString(animals));
            Arrays.sort(animals, new Comparator<Animal>() {
    
                public int compare(Animal o1, Animal o2) {
                    // TODO Auto-generated method stub
                    return o1.getAge() - o2.getAge();
                }
            });
            System.out.println(Arrays.toString(animals));
        }
    
    }

    如果 Dog 和 Cat 类都实现了 Comparable 接口,直接使用 

    static void sort(Object[] a)
              根据元素的自然顺序对指定对象数组按升序进行排序。

    反之,秉着不修改已完成代码的情况下排序则使用

    static
    <T> void
    sort(T[] a, Comparator<? super T> c)
              根据指定比较器产生的顺序对指定对象数组进行排序。
  • 相关阅读:
    Java关键字static、final使用小结
    JAVA的核心概念:接口(interface)
    Oracle数据泵导入导出数据,建立表空
    web.xml中load-on-startup的作用
    UIApplication 用法解析
    ios-Ineligible Devices 不被识别的设备
    Xcode真机测试could not find developer disk image解决方法
    异常捕获拒绝闪退 让应用从容的崩溃UncaughtExceptionHandler
    Xcode6之后创建Pch预编译文件
    MBProgressHUD的基本使用
  • 原文地址:https://www.cnblogs.com/microcat/p/6945259.html
Copyright © 2011-2022 走看看