Java Comparable與Comparator區別

1,兩種接口的展現

下面的程序是兩個類各自實現了Comparable接口、Comparator接口html

package com.cnblogs.mufasa.Solution;

import java.util.Comparator;

class Solution1 implements Comparable<Solution1>{
    int val;
    public Solution1(int val){
        this.val=val;
    }

    @Override
    public int compareTo(Solution1 o) {
        return val-o.val;
    }
}

class Solution2 implements Comparator<Solution2> {
    int val;
    public Solution2(int val){
        this.val=val;
    }

    @Override
    public int compare(Solution2 o1, Solution2 o2) {
        return o1.val-o2.val;
    }
}

public class Client{
    public static void main(String[] args) {
        Solution1 sl1=new Solution1(5);
        Solution1 sl2=new Solution1(1);
        System.out.println("sl1.compareTo(sl2):"+sl1.compareTo(sl2));

        Solution2 sl21=new Solution2(5);
        Solution2 sl22=new Solution2(1);
        System.out.println("sl21.compare(sl21,sl22):"+sl21.compare(sl21,sl22));
        System.out.println("sl21.compare(sl21,sl22):"+sl21.reversed().compare(sl21,sl22));
    }
}
/*
sl1.compareTo(sl2):4
sl21.compare(sl21,sl22):4
sl21.compare(sl21,sl22):-4
 */

 

2,兩種接口的比較

  經過上面的展現程序,咱們能夠發現這兩個接口實現起來都很簡單,而且實現的邏輯都基本同樣。可是差異仍是有的!java

   上面是我總結的一些各自的相同點與不一樣點。編程

3,各自優缺點

  Comparable實現簡單、功能純粹單一;Comparator實現可簡單可複雜,能夠在進行Collections.sort()以及Arrays.sort()中臨時實現這個接口,而且實現方式還花裏胡哨的【函數式編程、直接比較等等】ide

package com.cnblogs.mufasa.Solution2;

import java.util.Arrays;
import java.util.Comparator;

public class Person implements Comparable<Person> {
    private String name;
    private int age;
    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }

    @Override
    public int compareTo(Person o) {//先按照姓名的字典序排序,再按照年齡的由小到大排序
        String ab=name+o.name;
        String ba=o.name+name;
        int len=ab.length();
        for(int i=0;i<len;i++){
            int temp=ab.charAt(i)-'0'-ba.charAt(i);
            if(temp<0){
                return -1;
            }else if(temp>0){
                return 1;
            }
        }
        return age-o.age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

class Client{
    public static void main(String[] args) {
        Person[] ps=new Person[6];
        ps[0]=new Person("Mufasa",22);
        ps[1]=new Person("Mufasa",18);
        ps[2]=new Person("Wanyu",24);
        ps[3]=new Person("Guoyahong",24);
        ps[4]=new Person("Guoyahong",26);
        ps[5]=new Person("Admin",26);

        for(Person p:ps){
            System.out.print(p.getName()+","+p.getAge()+"\t");
        }
        System.out.println();

//        Arrays.sort(ps);//使用自帶的Comparable能夠直接實現
//        Arrays.sort(ps,Comparator.comparing(Person::getName).thenComparing(Person::getAge));//使用Comparator驗證成功
//        Arrays.sort(ps,Comparator.comparing(Person::getName).thenComparing(Person::getAge).reversed());//使用Comparator進行反轉reversed,總體反轉
//        Arrays.sort(ps,Comparator.comparing(Person::getName).reversed().thenComparing(Person::getAge));//使用Comparator進行反轉reversed,部分反轉1
        Arrays.sort(ps,Comparator.comparing(Person::getName).reversed().thenComparing(Person::getAge).reversed());//使用Comparator進行反轉reversed,部分反轉2

//        Arrays.sort(ps,(a,b)->{//利用Comparator接口的簡化函數式編程,平時我使用的就是這個簡單易用
//            String ab=a.getName()+b.getName();
//            String ba=b.getName()+a.getName();
//            int len=ab.length();
//            for(int i=0;i<len;i++){
//                int temp=ab.charAt(i)-'0'-ba.charAt(i);
//                if(temp<0){
//                    return -1;
//                }else if(temp>0){
//                    return 1;
//                }
//            }
//            return a.getAge()-b.getAge();
//        });

        for(Person p:ps){
            System.out.print(p.getName()+","+p.getAge()+"\t");
        }
        System.out.println();
    }
}

 

4,應用領域

  通常狀況下,咱們默認使用Comparable接口【優先選擇】,主要是由於這種比較方法簡單易實現,而且功能純粹;函數式編程

  若是Comparable實現的比較功能,咱們本身不滿意想要臨時更改,那麼花裏胡哨的Comparator就閃亮登場了,這個功能多,而且低耦合度,咱們可使用的時候隨意進行調整,而且還能夠【把多個Comparator鏈在一塊兒】去實現更加複雜的比較邏輯!函數

list.sort(Comparator.comparing(Employee::getSalary).thenComparing(Employee::getName));//多個Comparator連接組合成複雜排序-層級排序

 

5,參考連接

http://www.javashuo.com/article/p-vsitcfnl-bg.htmlthis

https://blog.csdn.net/bitcarmanlee/article/details/73381705spa

相關文章
相關標籤/搜索