一個最簡單的裝飾模式
http://www.wangchao.net.cn/bbsdetail_47757.html
如果要對一個List中的
如果要指定排序
http://blog.csdn.net/treeroot/archive/2004/10/19/142636.aspx
Collections.sort是按
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());
}) //這個是降序
沒理由這么復雜呀,如果比較的時候比較麻煩(可能需要比較好幾個屬性),難道也這么寫?
這里我們先看看Collections.reverseOrder是怎么實現的:
private static final Comparator REVERSE_ORDER = new ReverseComparator();
看看這個內部類的定義:
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只能對那些實現了Comparable接口的使用.
我們可以自己寫一個更簡單的,比較改一個
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));
}
}
就這么簡單!這個也算是
好了,以后要排序就可以這樣了
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?
這個應該是理所當然的呀,但是 -Integer.MIN_VALUE=Integer.MIN_VALUE.
也就是1000...000=-1000...000,就因為這一種情況所以不能直接返回-cmp,其實這樣的
情況機會不會發生,即使直接返回-cmp大部分情況也不會出問題.