在實際開發中,我們常常需要對某些數據進行排序,這些數據往往使用數組 或者集合保存。對於數組中的數據排序,API中提供了一個數組的工具類, java.util.Arrays,類中重載了大量的sort方法,可以對各種類型的數組進行排 序。如對於Object類型數組排序有如下方法:
public static void sort(Object[] a)
假設有類Course,如下:
package com.csst.relation;
public class Course {
private String title;
private double price;
public Course(String title, double price) {
super();
this.title = title;
this.price = price;
}
public Course(String title) {
super();
this.title = title;
}
public Course() {
super();
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
如果有一個Course類型的數組,需要排序,按照Arrays類的方法,仿佛只要 將數組作為參數,傳遞給sort方法即可。但是只要我們深入考慮一下,就會發現 問題。對於Course對象,所謂的順序應該有個排序標准,比如,按照價格排,還 是名稱排?這個排序標准確定了,才能對多個Course對象排序。
仔細閱讀Arrays.sort方法的詳細描述,會發現有一個要求,即使用該方法排 序的對象,必須是Comparable類型的。Comparable是一個接口,只要Course類實 現這個接口即可,覆蓋其中的方法:
public int compareTo(Object o)
假設,我們希望Course數組根據price排序,那麼將Course類實現Comparable 接口,覆蓋compareTo方法:
public int compareTo(Object arg0) {
// TODO Auto-generated method stub
Course c=(Course)arg0;
if(this.price>c.price){
return 1;
}else if(this.price>c.price){
return -1;
}else{
return 0;
}
}
初學者可以借助這個例子,理解一下接口的作用。接口Comparable定義了所 有需要使用sort方法排序的對象的共同行為,否則sort方法根本無法實現。
如果Course數組可能根據價格排序,也可能需要根據名稱排序,顯然使用這 個方法就有局限性,因為compareTo方法只可能實現一種比較邏輯。Arrays類中 還有另外一種排序方法:
public static void sort(Object[] a, Comparator c)
Comparator是另一個接口,其中有一個方法:
public int compare(Object o1, Object o2)
只要創建一個類,實現Comparator接口,實現compare方法,就可以進行排序 ,如下:
package com.csst.relation;
import java.util.Comparator;
public class PriceComp implements Comparator {
public int compare(Object arg0, Object arg1) {
// TODO Auto-generated method stub
Course c1=(Course)arg0;
Course c2=(Course)arg1;
if(c1.getPrice()>c2.getPrice()){
return 1;
}else if(c1.getPrice()<c2.getPrice()){
return -1;
}else{
return 0;
}
}
}
有了這個實現類,使用Arrays.sort(Object[] o,Comparator c)方法,即可 以根據Comparator對象中的compare方法的比較算法進行排序。如果需要按照其 他標准排序,只要重新寫類,實現Comparator接口即可。
通過本篇的學習,初學者不僅能掌握數組排序的方法,更能對Comparable和 Comparator接口比較熟悉。更進一步,還是建議能借此例子,理解接口的作用。