Java‎ > ‎

Arrays.sort()

Class:java.util.Arraysjava.util.Comparatorjava.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
=============================================

Comments