Class:
java.util.Arrays 、java.util.Comparator 、java.lang.Comparable J2SE 本身提供了許多讓 programmer 變笨變懶的好東西,今天要介紹的就是將一個 array 排序的功能。
Arrays 這個 class 針對 array 提供了許多便利的操作,其中一個就是將 array 排序。由 primitive date type 所組成的 array,排序起來很簡單。例如,我們要對 intArray(一個宣告為
int 的 array)作排序,只要寫 Arrays.sort(intArray) 就可以了。是的,不用自己寫一個 sort、也不用擔心 performance 的問題(要是你寫的 sort 能比 SUN 公司的好... 趕快去申請專利吧!)。那如果自己撰寫的 class 是不是就不能使用
Arrays.sort() 呢?當然不是... 這樣設計這個 method 就失去了 reuse 的能力啦。我們只要在自己撰寫的 class,然後去 implement Comparable 也是可以的啦~ 以下是痞子所設計的 class:class PsObj implements Comparable{ int value; String name; PsObj(int v, String s){ value=v; name=s; } public String toString(){ return name+":"+value; } public int compareTo(Object o1){ //物件本身與 o1 相比較,如果 retrun 正值,就表示比 o1 大 if(this.value>((PsObj)o1).value){ return 1; }else{ return -1; } } }
因為要 implement
Comparable ,所以得實作 compareTo() 這個 method。有了這個 method,那麼 Arrays.sort() 就能依照這個 method 的回傳值來作 sort 的依據。事實上,primitive data type 也都有 implement Comparable ,所以才能夠這樣子使用。一般而言,我們習慣的排序結果是由小到大,所以在 compareTo() 當中「大於」是回傳正值,如果你希望得到的結果是由大到小,那麼只要 return 的部分改一下,也就可以了。不過不建議這樣子作,會降低程式可讀性;況且,只要把陣列逆向 traversal 不就得到一樣的結果啦...那麼... 如果想要用兩種以上的排序方式,那該怎麼辦呢?沒關係,還有
Arrays.sort(Object, Comparator) 這個 method,讓我們可以透過傳遞一個實作 Comparator 的自訂物件,來依照我們的需求排序。以下是痞子撰寫的 comparator,很機車地以 PsObj.name 的第二個 char 來當作排序的依據:class CompareByName implements Comparator{ public int compare(Object obj1, Object obj2){ PsObj o1=(PsObj) obj1; PsObj o2=(PsObj) obj2; if(o1.name.charAt(1)>o2.name.charAt(1)){ return 1; } if(o1.name.charAt(1)<o2.name.charAt(1)){ return -1; } return 0; } } 其中的細節其實跟上頭沒什麼兩樣,就不再贅述。執行程式會長這樣:
import java.util.*; public class ArraySort{ public static void main(String args[]) { PsObj array[] = new PsObj[2]; array[0]=new PsObj(10, "第1個物件"); array[1]=new PsObj(-10, "第2個物件"); System.out.println("==> 用本身的排序方式 <=="); Arrays.sort(array); showArray(array); System.out.println("==> 用 name 的第二個字元排序 <=="); Arrays.sort(array, new PsObjName()); showArray(array); } private static void showArray(PsObj a[]){ for(int i=0; i<a.length; i++){ System.out.println("Array["+i+"] → "+a[i]); } System.out.println("============================================="); } } 執行結果:
==> 用本身的排序方式 <== Array[0] → 第2個物件:-10 Array[1] → 第1個物件:10 ============================================= ==> 用 name 的第二個字元排序 <== Array[0] → 第1個物件:10 Array[1] → 第2個物件:-10 ============================================= |
Java >