<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    一個最簡單的裝飾模式

    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隨筆
    主站蜘蛛池模板: 国产美女视频免费观看的网站| 亚洲AV无码AV吞精久久| 国产在线播放线91免费| 亚洲精品国产精品乱码不卡| 国产亚洲午夜精品| 亚洲国产精品激情在线观看| 欧亚一级毛片免费看| 亚洲av无码不卡私人影院| 男女作爱免费网站| 亚洲日本中文字幕天堂网| 久青草视频在线观看免费| 亚洲精品无码久久久久| 99re视频精品全部免费| 亚洲国产成人91精品| 免费理论片51人人看电影| 美女的胸又黄又www网站免费| 亚洲免费日韩无码系列| 久久久久成人片免费观看蜜芽| 亚洲黄色免费在线观看| 成人au免费视频影院| 黄页网址在线免费观看| 亚洲精品中文字幕乱码三区| 久久久久久国产精品免费无码| 亚洲天堂中文字幕在线观看| 午夜毛片不卡高清免费| 亚洲免费日韩无码系列| 亚洲人成亚洲精品| 日韩高清在线免费看| 羞羞视频免费网站在线看| 久久久久久亚洲Av无码精品专口 | 亚洲精品国产第一综合99久久| 国产一区二区三区无码免费| 一日本道a高清免费播放| 亚洲综合一区二区| 免费a级毛片18以上观看精品| 日韩精品无码免费专区午夜| 亚洲图片激情小说| 亚洲人成人网站在线观看| 免费人成视频在线观看网站| 亚洲欧美在线x视频| 久久久久久a亚洲欧洲AV|