對於Java中一個已經存在的List<Bean>來說,要給他排序,傳統上有兩種方式:一個是Bean要實現Comparable接口,另一個是創建Comparator子類。
第一種方式需要在原有的Bean上擴展Comparable接口,一般使用不多,因為最好不要隨意更改JavaBean。
第二種方式則是獨立於原有JavaBean,實現的方法需要傳入兩個Bean對象。
關於這兩種方式的使用,可以參考:http://www.blogjava.net/fastunit/archive/2008/04/08/191533.html
在排序的時候,用到Arrays.sort(Array arr,Comparator comparator)方法或者是Collentions.sort(Collection<?> coll,Comparator comparator)方法進行排序。
但是,這里我並不打算使用傳統的方式排序。傳統的方法一個需要擴展原有Bean,另一個需要新建一個Java類,這樣的工作方式看起來笨重,操作起來也不方便。如果要對10個不同類型List集合排序,它就需要擴展10個Bean,或者新建10個類。
下面的方法,使用到Apache Commons下的commons-beanutils和commons-collections包,實現的是一個簡單、通用的排序:
/** * @describe 依據某個字段對集合進行排序 * @author ... * @date 2013-1-22 下午3:44:47 * @param list * 待排序的集合 * @param fieldName * 依據這個字段進行排序 * @param asc * 如果為true,是正序;為false,為倒序 */ @SuppressWarnings("unchecked") public static <T> void sort(List<T> list, String fieldName, boolean asc) { Comparator<?> mycmp = ComparableComparator.getInstance(); mycmp = ComparatorUtils.nullLowComparator(mycmp); // 允許null if (!asc) { mycmp = ComparatorUtils.reversedComparator(mycmp); // 逆序 } Collections.sort(list, new BeanComparator(fieldName, mycmp)); }
這個方法完全沒必要使用泛型方法的定義,實際應用中可以去掉泛型方法定義。
一個使用的例子:
List<Category> list = new ArrayList<Category>(); Util.sort(list, "position", false);
position是Category類中一個用於排序字段。
關於commons-beanutils和commons-collections的詳細使用,這里不多介紹。有興趣的可以去查資料,研究一下。(如果不研究,上面的方法也是不能看懂的)
多一句:在Java中,如果遇到要做重復的事情,我們就來精神了,因為這樣的事情我們往往抽象出來做一次就夠了!