Comparable和Comparator的使用

概述:

在對一個類進行排序的時候,如果用jdk自帶排序工具類排序,則需要讓該類實現comparbale接口,或這在外部實現一個Comparator接口,進行排序。對於這兩種排序方式的使用,以及他們之間的區別,在此做一個簡單的介紹。

Comparable接口

實現了Comparable接口的類,需要實現compareTo方法。jdk中的默認排序都是通過判斷此接口實現,通過該接口的compareTo方法返回值比較大小排序。如Collections.Sort,及TreeMap中的排序都是默認通過compareTo的返回值進行排序。Comparable常被稱爲內比較器。
compareTo方法的返回值是int,有三種情況:
1、比較者大於被比較者(也就是compareTo方法裏面的對象),那麼返回正整數
2、比較者等於被比較者,那麼返回0
3、比較者小於被比較者,那麼返回負整數

Comparator接口

Comparator接口有一個compare方法,若想通過Comparator接口排序,則必須實現該類的compare方法,排序的時候,通過該方法的返回值進行排序。利用Comparator接口排序,不需要待排序的類實現該接口,而是定義一個全新的比較器類進行比較(具體比較規則,由用戶根據具體場景定義)。Comparator常被成爲外比較器。
compare方法返回值和Comparable接口一樣是int,有三種情況:
1、o1大於o2,返回正整數
2、o1等於o2,返回0
3、o1小於o3,返回負整數

例子

待排序類

package model;

public class SortModel implements Comparable<SortModel> {
    public int age;
    public String name;

    @Override
    public int compareTo(SortModel o) {
        // TODO Auto-generated method stub
        return o.age-age;
    }

    public SortModel(){

    }
    public SortModel(int age,String name){
        this.age =age;
        this.name = name;
    }

}

測試類

package main;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

import model.SortModel;

public class TestSortModel {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List<SortModel> Models = new ArrayList<SortModel>(30);
        for (int i = 0; i < 10; i++) {
            int age = (int) (Math.random()*100);
            //int age = i;
            Models.add(new SortModel(age, "wwzhang" + age));
        }
        System.out.println("未排序:");
        printList(Models.iterator());
        //實現comparable 自排序
        Collections.sort(Models);
        System.out.println("Comparable 自排序:");
        printList(Models.iterator());
        //藉助Comparator 外排序
        Comparator<SortModel> partor = new Comparator<SortModel> (){

            @Override
            public int compare(SortModel o1, SortModel o2) {
                // TODO Auto-generated method stub
                return o1.age-o2.age;
            }
        };
        Collections.sort(Models,partor);
        System.out.println("Comparator 外排序:");
        printList(Models.iterator());

    }
    //遍歷打印
    public static void printList(Iterator<SortModel> iterator){
        while(iterator.hasNext()){
            SortModel model = iterator.next();
            System.out.println("Age:"+model.age+"\t"+"name:"+model.name);
        }
        System.out.println("-------------------------------------------");
    }

}

打印結果:
這裏寫圖片描述
說明:
通過comparable接口實現排序,是jdk中集合的默認排序,但和待排序類耦合,一旦確定排序方式,要修改排序方式,需修改具體待排序類。
通過comparator接口實現排序,可以根據具體業務需求,實現排序,屬於設計模式中的策略模式,有具體使用者更加具體使用情況,定義排序方式。如上面例子,使用自排序,默認根據Age降序排列,但若用戶需求改變,則可以定義Comparator接口的比較器 類,修改爲降序排列,當然也可以定義成根據名子排序。

希望對您有所幫助

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章