一個最簡單的裝飾模式
http://www.wangchao.net.cn/bbsdetail_47757.html
如果要對一個List中的元素排序,如果List中的元素是可排序的(實(shí)現(xiàn)了Comapable),直接Collections.sort(list).
如果要指定排序算法,可以使用Comparator,可以參考:
http://blog.csdn.net/treeroot/archive/2004/10/19/142636.aspx
Collections.sort是按升序排序的,如果要按降序呢?其實(shí)很簡單,只要自己重新定義一個Comparator就可以了.
List list=new ArrayList();
list.add(new Integer(3));
list.add(new Integer(53));
list.add(new Integer(34));
Collections.sort(list); //這個是升序
Collections.sort(list,Collections.reverseOrder());//這個是降序
上面的是對于可排序的元素,對于不可排序的元素呢?
List list= new ArrayList();
list.add(new Object());
list.add(new Object());
list.add(new Object());
Collections.sort(list,new Comparator(){ public int compare(Object o1, Object o2){
return (o1.hashCode()-o2.hashCode());
}) //這個是升序
Collections.sort(list,new Comparator(){ public int compare(Object o1, Object o2){
return (o2.hashCode()-o1.hashCode());
}) //這個是降序
沒理由這么復(fù)雜呀,如果比較的時候比較麻煩(可能需要比較好幾個屬性),難道也這么寫?
這里我們先看看Collections.reverseOrder是怎么實(shí)現(xiàn)的:
private static final Comparator REVERSE_ORDER = new ReverseComparator();
看看這個內(nèi)部類的定義:
private static class ReverseComparator implements Comparator,Serializable {
private static final long serialVersionUID = 7207038068494060240L;
public int compare(Object o1, Object o2) {
Comparable c1 = (Comparable)o1;
Comparable c2 = (Comparable)o2;
int cmp = c1.compareTo(c2);
return -(cmp | (cmp >>> 1));
}
}
好簡單吧,但是這個Comparator只能對那些實(shí)現(xiàn)了Comparable接口的使用.
我們可以自己寫一個更簡單的,比較改一個函數(shù)compare嗎?改變符號就行了.
public class ReverseComparator implements Comparator,Serializable{
private Comparator comparator;
public ReverseComparator(Comparator comp){
this.comparator=comp;
}
public int compare(Object o1,Object o2){
cmp=comparator(o1,o2);
return -(cmp | (cmp>>>1));
}
}
就這么簡單!這個也算是設(shè)計(jì)模式嗎?難道設(shè)計(jì)模式很復(fù)雜嗎?
好了,以后要排序就可以這樣了
Comparator comp=....;
Collections.sort(list,comp);//升序
Collections.sort(list,new ReverseComparator(comp));//降序
這里注意:
1.compare方法如果這樣寫也可以:
if(cmp<0) return -1;
else if(cmp>0) return 1;
else return 0;
但是效率相對差一些.
2.為什么不能返回直接返回-cmp?
這個應(yīng)該是理所當(dāng)然的呀,但是 -Integer.MIN_VALUE=Integer.MIN_VALUE.
也就是1000...000=-1000...000,就因?yàn)檫@一種情況所以不能直接返回-cmp,其實(shí)這樣的
情況機(jī)會不會發(fā)生,即使直接返回-cmp大部分情況也不會出問題.
posted on 2009-04-01 15:32
圣克爾·光 閱讀(304)
評論(0) 編輯 收藏 所屬分類:
Java隨筆