對於一般的List的排序可以使用java.util.Collections.sort(List<T>, Comparator<? super T>)這樣簡單易用的方法。但是經常看到有人在問如何對元素的多欄位排序。這個問題就像SQL語句裏面的‘Order By’語句,後面可以跟若干個排序條件。
譬如對於元素Foo排序:
class Foo{
int a;
int b;
}
Foo.a是第一排序欄位,Foo.b是第二排序欄位,也就是在Foo.a相等的2個Foo的情況下判斷Foo.b。那麽我們的Comparator可以這樣寫:
Collections.sort(l, new Comparator<Foo>(){<br /> @Override<br /> public int compare(Foo f1, Foo f2) {<br /> if(f1.a-f2.a>0){<br /> return 1;<br /> }else if (f1.a-f2.a<0){<br /> return -1;<br /> }else{//Foo.a equal, then check Foo.b<br /> return f1.b-f2.b;<br /> }<br />}});
或者可以用一個比較通用的方法:
/**<br /> * Sort <code>List</code> by multiple conditions.<br><br /> * It's like SQL 'Order by' clause. Input multiple <code>Comparator</code><br /> * in List as argument.<br /> *<br /> * @param <T><br /> * @param list<br /> * @param comparatorList<br /> * @throws IllegalArgumentException if comparatorList is empty<br /> * @author shengyuan.lu 盧聲遠<michaellufhl@yahoo.com.cn><br /> */<br />public static <T> void sort(List<T> list, final List<Comparator<T>> comparatorList) {<br /> if (comparatorList.isEmpty()) {//Always equals, if no Comparator.<br /> throw new IllegalArgumentException("comparatorList is empty.");<br /> }<br /> Comparator<T> comparator = new Comparator<T>() {<br /> public int compare(T o1, T o2) {<br /> for (Comparator<T> c:comparatorList) {<br /> if (c.compare(o1, o2) > 0) {<br /> return 1;<br /> } else if (c.compare(o1, o2) < 0) {<br /> return -1;<br /> }<br /> }<br /> return 0;<br /> }<br /> };<br /> Collections.sort(list, comparator);<br /> }
最個方法就是把每個排序Comparator組合成一個Comparator,然後排序。