Comparator與Comparable比較

Comparator和Comparable比較:

參數(shù) Comparable Comparator
排序邏輯 排序邏輯必須在待排序?qū)ο蟮念愔?,故稱之為自然排序 排序邏輯在另一個(gè)實(shí)現(xiàn)
實(shí)現(xiàn) 實(shí)現(xiàn)Comparable接口 實(shí)現(xiàn)Comparator接口
排序方法 int compareTo(Object o1) int compare(Object o1,Object o2)
觸發(fā)排序 Collections.sort(List) Collections.sort(List, Comparator)
接口所在包 java.lang.Comparable java.util.Comparator
Comparable接口:
  • Comparable接口可以認(rèn)為是一個(gè)內(nèi)部比較器;
  • 該接口對(duì)每個(gè)實(shí)現(xiàn)它的類的對(duì)象強(qiáng)加了排序規(guī)則,該排序稱為自然排序,方法public int compareTo(T o)是自然排序的排序方法;
  • 如果開發(fā)者add進(jìn)入一個(gè)Collection的對(duì)象想要Collections的sort方法幫你自動(dòng)進(jìn)行排序的話,那么這個(gè)對(duì)象必須實(shí)現(xiàn)Comparable接口。compareTo方法的返回值是int,有三種情況:
    1、比較者大于被比較者(也就是compareTo方法里面的對(duì)象),那么返回正整數(shù)
    2、比較者等于被比較者,那么返回0
    3、比較者小于被比較者,那么返回負(fù)整數(shù)
  • 實(shí)現(xiàn)Comparable接口的實(shí)體:實(shí)例Person以姓名升序排序,若姓名一樣則按照年齡排序
public class Person  implements Comparable {
    private String name;
    private Integer age;
    private String mind;
    //省略getter 和 setter方法、構(gòu)造函數(shù)、toString函數(shù)
    @Override
    public int compareTo(Object o) {
        Person targetPerson = (Person)o;
        int ret = this.name.compareTo(targetPerson.getName());
        if(ret == 0){
            return Integer.compare(this.age,targetPerson.getAge());
        }
        if(ret == 0){
            return this.getMind().compareTo(targetPerson.getMind());
        }
        return ret;
    }
}
Comparator接口:
  • Comparator可以認(rèn)為是是一個(gè)外比較器;
  • JDK的大量的類包括常見的 String、Byte、Char、Date等都實(shí)現(xiàn)了Comparable接口;
  • Comparator接口里面有一個(gè)compare方法,方法有兩個(gè)參數(shù)T o1和T o2,是泛型的表示方式,分別表示待比較的兩個(gè)對(duì)象,方法返回值和Comparable接口一樣是int,有三種情況:
    1、o1大于o2,返回正整數(shù)
    2、o1等于o2,返回0
    3、o1小于o2,返回負(fù)整數(shù)
  • 實(shí)現(xiàn)Comparator接口的實(shí)體:實(shí)例Person以姓名升序排序,若姓名一樣則按照年齡排序
public class PersonComparator implements Comparator<Person> {
    @Override
    public int compare(Person p1, Person p2) {
        //使用到了Person類中的compareTo方法進(jìn)行比較
        //若Person沒實(shí)現(xiàn)Comparable接口,也可以自行比較
        int ret = p1.getName().compareTo(p2.getName());
        if(ret == 0){
            return p1.getAge().compareTo(p2.getAge());
        }
        return ret;
    }
}

測試比較:

public class Test {
    public static void main(String[] args){
        //生成數(shù)據(jù)
        List<Person> personList1 = generatePersonList();
        List<Person> personList2 = generatePersonList();
        //排序一:
        Collections.sort(personList1);
        print("Collections.sort(list)",personList1);
        //排序二
        PersonComparator pc = new PersonComparator();
        //PersonComparator2 pc2 = new PersonComparator2();
        Collections.sort(personList2,pc.thenComparing(pc));
        print("thenComparing",personList2);
    }

    //生成待排序數(shù)組
    private static List<Person> generatePersonList() {
        List<Person> retList = new ArrayList<>(16);
        retList.addAll(
                Arrays.asList(
                        new Person[]{
                                new Person("erMaZi", 19, "good"),
                                new Person("wangWu", 18, "middle"),
                                new Person("liSi", 17, "bad"),
                                new Person("wangWu", 16, "middla"),
                        }
                )
        );
        return retList;
    }
    public static void print(String message,List<Person> personList){
        System.out.println(message+":");
        for(Person p:personList){
            System.out.println(p);
        }
        System.out.println();
    }
}
jdk官方默認(rèn)排序:
  • 升序
< return -1
= return 0
> return 1
  • 降序
< return 1
= return 0
> return -1
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容