概述:
在對一個類進行排序的時候,如果用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接口的比較器 類,修改爲降序排列,當然也可以定義成根據名子排序。
希望對您有所幫助