2008年10月8日 星期三

[Displaytag] 數字排序,外部排序

Displaytag 的確可以讓我們省下分頁功能的撰寫,並且透過輕鬆簡單的設定就可以完成。

不過,當你面對到數字的排序時,你就會發現頭大了!為甚麼 850 會比 1001 大?這下問題嚴重了,有經驗的人一看就知道這是因為 displaytag 排序的方式是由左至右比較編碼(我也不知道是用 ASCII 還是哪種方式),總之,排序出來的結果就不是我們要的!

首先我們需要先建立一個新的 class 他主要是用來比較出真正的數值,而不是用編碼的方式來比較,那為什麼要比較勒?很簡單!因為所有的排序都是兩兩比較的阿!既然需要比較,那我們就應該要 implement Comparator,而且,在JDK 5.0 以後的環境,我們有了 Generic 可以使用,所以我們就設定我們要 implement Comparator<String>。那又為什麼是要用 String 呢?因為當初會排序失敗,是因為 displaytag 是直接用字串來比較排序的!所以就用 String 囉~ 很直觀吧!

我們完成的 class 如下:

public class NumberComparator implements Comparator<String>
{

    public int compare(String arg0, String arg1)
    {
        Double num1 = Double.parseDouble(arg0);
        Double num2 = Double.parseDouble(arg1);
        return num1.compareTo(num2);
    }

}

在這裡我們因為 implement Comparator interface,所以我們要實做出 compare() method,那因為我們是要作數字的比較,我們就將傳入的兩個字串parameter 先轉換成 Double (這裡不用 Integer 是怕數字的位數不夠,乾脆就一勞永逸)。

Then? 看到這裡你一定會這樣問,好像很直觀的想法到這裡就卡住了!

別急,我們還沒找過 displaytag 的 tags 與 attributes。看看 tag reference 我們就可以發現,display:column tag 中有個 attribute 為 comparator,並且從描述中就可以瞭解到此 attribute 是用來讓我們可以增加自己的 comparator,所以我們就將我們剛剛傳寫好的 NumberComparator 指定給要使用數字排序的 column。這樣就大功告成~ 收工!~

1 則留言:

Unknown 提到...

HI 我測試了一下不行哦..
能否把你MSN留下,請教一下呢?
我的dmewy@live.cn