<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隨筆
    主站蜘蛛池模板: 亚洲国产精品碰碰| 国产乱子精品免费视观看片| 歪歪漫画在线观看官网免费阅读 | 精品免费视在线观看| 亚洲国产激情一区二区三区| 无码天堂va亚洲va在线va| 青青青青青青久久久免费观看| 亚洲Av高清一区二区三区| 免费观看美女用震蛋喷水的视频| 亚洲AV午夜成人片| 日韩视频免费在线观看| 亚洲欧洲免费视频| 最近免费中文字幕大全免费| 亚洲成人免费网址| 成人免费福利电影| 美女的胸又黄又www网站免费| 免费在线观看毛片| 久青草视频97国内免费影视| 亚洲AV无码一区东京热久久| h在线观看视频免费网站| 亚洲综合校园春色| 又粗又大又长又爽免费视频| 国产97视频人人做人人爱免费| 亚洲日韩v无码中文字幕| 120秒男女动态视频免费| 中文字幕亚洲综合久久综合| 四虎在线播放免费永久视频| 一级做a爱过程免费视| 久久久久久亚洲精品| 青青青国产在线观看免费网站| 亚洲日本VA午夜在线电影| 亚洲国产精品一区二区第一页免| 日本免费A级毛一片| 亚洲人成电影院在线观看| 国产免费观看黄AV片| 99在线免费视频| 国产午夜亚洲精品国产| 久久久青草青青国产亚洲免观 | 热99re久久精品精品免费| 美女无遮挡拍拍拍免费视频| 亚洲网站在线播放|