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

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          一個最簡單的裝飾模式

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

          如果要對一個List中的元素排序,如果List中的元素是可排序的(實現了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());
            }) //這個是降序
            沒理由這么復雜呀,如果比較的時候比較麻煩(可能需要比較好幾個屬性),難道也這么寫?
            這里我們先看看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接口的使用.
            我們可以自己寫一個更簡單的,比較改一個函數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));
            }
            }
            就這么簡單!這個也算是設計模式嗎?難道設計模式很復雜嗎?
            好了,以后要排序就可以這樣了
            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大部分情況也不會出問題.

          posted on 2009-04-01 15:32 圣克爾·光 閱讀(309) 評論(0)  編輯  收藏 所屬分類: Java隨筆
          主站蜘蛛池模板: 东山县| 乐山市| 彭阳县| 博客| 荆州市| 六安市| 十堰市| 来安县| 平度市| 都江堰市| 都安| 罗江县| 文山县| 夏邑县| 常熟市| 繁昌县| 长治市| 师宗县| 泉州市| 宁都县| 镇坪县| 茂名市| 南京市| 巴林右旗| 金川县| 万荣县| 防城港市| 巴里| 芜湖市| 白水县| 积石山| 秦皇岛市| 全南县| 许昌县| 济阳县| 汨罗市| 安乡县| 周宁县| 鄂伦春自治旗| 南陵县| 桦甸市|