Comparator 和 Comparable 的比較與用法
阿新 • • 發佈:2019-12-31
先大體看一下這兩個介面各自的區別:
-
Comparable是排序介面,常用於自然排序;若一個類實現了Comparable介面,就意味著“該類支援排序”。
-
Comparator是比較器,常用於需要對排列的順序進行精確控制的情況;我們若需要控制某個類的多個物件的次序,可以建立一個“該類的比較器”來進行排序。
通過程式碼來細看它們的不同實現與作用
內部比較器 comparable 主要程式碼
public class Dayimplements Comparable {
private int year;
public Day(int year) {
this .year = year;
}
/**
* @desc 重寫compareTo函式。通過year來比較,如果return 的大於0 則當前類排在比較類的後面
* 如果return 的小於0 則當前類排在比較類的前面
*/
public int compareTo(Day otherDay) {
return year - otherDay.year;
}
@Override
public String toString() {
return "year=" +year;
}
public int getYear() {
return year;
}
}
複製程式碼
外部比較器 comparator 主要程式碼
public class AscOperation implements Comparator<Day> {
/**
* @desc compare函式。通過year來比較,如果return 的大於0 則前一位排在後一位的後面
* 為升序,如果return 的小於0 則前一位排在後一位的的前面,為降序
*/
public int compare(Day day1,Day day2) {
return day1.getYear() - day2.getYear();
}
}
複製程式碼
客戶端呼叫程式碼
public class Main {
public static void main(String[] args){
List days =new ArrayList();
days.add(new Day(2018));
days.add(new Day(2017));
days.add(new Day(2019));
//內部實現排序
Collections.sort(days);
System.out.printf("list:%s\n",days);
//依靠外部方法實現排序
Collections.sort(days,new DescOperation());
System.out.printf("list:%s\n",days);
Collections.sort(days,new AscOperation());
System.out.printf("list:%s\n",days);
}
}
複製程式碼