在實際開發中,我們常常需要對某些數據進行排序,這些數據往往使用數組 或者集合保存。對於數組中的數據排序,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接口比較熟悉。更進一步,還是建議能借此例子,理解接口的作用。