美文网首页
Comparable vs Comparator

Comparable vs Comparator

作者: 育王净量 | 来源:发表于2019-04-10 21:18 被阅读0次

sorting 排序

sorting-in-java
Java中提供了Arrays.sort()和Collections.sort()方法用来提供排序,其中排序算法使用的是 QuickSort 快速排序算法,并且默认是升序排列,如果使用降序排列,可以使用Collections.reverseOrder()方法做为参数,同时sort方法还提供了局部排序的方法。

@Test
    public void testA(){
        
        Comparator comparator = (o1, o2) -> 0;
        Comparable comparable = o -> 0;

        Integer[] arr = { 13, 7, 6, 45, 21, 9, 101, 102 };
        Arrays.sort(arr, 1, 3);
        System.out.println(Arrays.toString(arr));
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
        Arrays.sort(arr, Collections.reverseOrder());
        System.out.println(Arrays.toString(arr));
        
        String[] str = {"z", "a", "f", "b", "n", "m"};
        Arrays.sort(str, 0, 3);
        System.out.println(Arrays.toString(str));
        Arrays.sort(str);
        System.out.println(Arrays.toString(str));
        Arrays.sort(str, Collections.reverseOrder());
        System.out.println(Arrays.toString(str));
    }
    
    @Test
    public void testB(){
        List<Integer> list = Arrays.asList(13, 7, 6, 45, 21, 9, 101, 102 );
        Collections.sort(list);
        System.out.println(list);
        Collections.sort(list, Collections.reverseOrder());
        System.out.println(list);
        
        List<String> strList = Arrays.asList("z", "a", "f", "b", "n", "m");
        Collections.sort(strList);
        System.out.println(strList);
        Collections.sort(strList, Collections.reverseOrder());
        System.out.println(strList);
    }

comparable-vs-comparator

// 独立的比较器
import java.util.Comparator;

// 需要类实现接口,重写compareTo方法
import java.lang.Comparable;

与此同时sort方法还可以接收Comparator比较器做为参数来实现自定义排序。Comparable 可以让实现它的类的对象进行比较,类内部要实现 compareTo 方法。

class A implements Comparable<A>{
    private int a;
    
    /**
     * - a1.compareTo(a2) > 0 即 a1 > a2
     * - a1.compareTo(a2) = 0 即 a1 = a2
     * - a1.compareTo(a2) < 0 即 a1 < a2
     */
    @Override
    public int compareTo(A o) {
        
        // 兼容NP场景;
        if(Objects.isNull(o)) return 1;
        return a - o.a;
    }
    
    public static void main(String[] args) {
        A a = new A();
        System.out.println(a.compareTo(null));
    }
}

自然排序需要类实现 Comparable接口,同时重写 comparaTo 方法。Comparator 则是在外部制定排序规则,然后作为排序策略参数传递给某些类,比如 Collections.sort(), Arrays.sort(), 或者一些内部有序的集合(比如 SortedSet,SortedMap 等)。

class A {
    private int a;
    private static final Comparator<A> comparator = (o1, o2) -> o1.a - o2.a;
    
    public static void main(String[] args) {
        A[] array = { new A(2), new A(1), new A(3)};
        Arrays.sort(array, comparator);
        for (A a : array) {
            System.out.println(a.a);
        }
    }
    
    public A(int a){
        this.a = a;
    }
}

参考

相关文章

网友评论

      本文标题:Comparable vs Comparator

      本文链接:https://www.haomeiwen.com/subject/lltaiqtx.html