隨筆 - 22  文章 - 3  trackbacks - 0
          <2009年4月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          一個最簡單的裝飾模式

          http://www.wangchao.net.cn/bbsdetail_47757.html

          如果要對一個List中的元素排序,如果List中的元素是可排序的(實現(xiàn)了Comapable),直接Collections.sort(list).
            如果要指定排序算法,可以使用Comparator,可以參考:
          http://blog.csdn.net/treeroot/archive/2004/10/19/142636.aspx
            Collections.sort是按升序排序的,如果要按降序呢?其實很簡單,只要自己重新定義一個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是怎么實現(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只能對那些實現(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è)計模式嗎?難道設(shè)計模式很復(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,就因為這一種情況所以不能直接返回-cmp,其實這樣的
            情況機會不會發(fā)生,即使直接返回-cmp大部分情況也不會出問題.

          posted on 2009-04-01 15:32 圣克爾·光 閱讀(314) 評論(0)  編輯  收藏 所屬分類: Java隨筆
          主站蜘蛛池模板: 海南省| 定陶县| 朝阳区| 衢州市| 平邑县| 迁安市| 仁布县| 苍溪县| 封丘县| 阿拉善左旗| 连云港市| 安福县| 霞浦县| 扶绥县| 新化县| 汉寿县| 马山县| 邛崃市| 晋宁县| 岑溪市| 定南县| 榆社县| 台东县| 浦县| 通河县| 新源县| 汨罗市| 铁岭市| 八宿县| 丹阳市| 惠州市| 西青区| 吉首市| 庆城县| 莒南县| 蕲春县| 格尔木市| 苏尼特左旗| 扎鲁特旗| 温州市| 射阳县|