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

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

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

    隨筆-60  評論-138  文章-1  trackbacks-0

    關于排序

    眾所周知,如果需要在 Java 中使用排序方法,那么就需要實現

    Comparable
    接口。
    ?

    public interface java.lang.Comparable {

    ??????????????public int compareTo(Object o);

    ???? }

    ?

    ?

    ????Comparable 接口很簡單,因為它只有一個方法;然而如果你需要根據多

    個屬性對對象進行排序,那么實現
    compareTo 方法就會變得很復雜。

    ??????
    下邊就是一個摘自 Jakarta Commons cookbook 的例子:


    package com.discursive.jccook.collections.compare;


    import java.util.*;


    import org.apache.commons.lang.StringUtils;


    import org.apache.commons.collections.comparators.ReverseComparator;

    ?

    public class BookComparator implements Comparator {

    ???
    public int compare(Object o1, Object o2) {

    ????????
      
    int comparison = -1;

    ???????
       
    if( o1 instanceof Book && o2 instanceof Book ) {


    ???????????
    Book b1 = (Book) o1;


    ???????????
    Book b2 = (Book) o2;


    ????????????
    String b1Name = b1.getName( );


    ????????????
    String b2Name = b2.getName( );


    ????????????
    String b1Author = b1.getAuthor( );


    ????????????
    String b2Author = b2.getAuthor( );


    ???????????
    if( StringUtils.isNotEmpty( b1Name ) &&


    ??????????????
    StringUtils.isNotEmpty( b2Name ) ) {


    ???????
    ?????????comparison = b1Name.compareTo( b2Name );


    ???????????
    }


    ???????????
    if( comparison == 0 &&


    ???????????????
    StringUtils.isNotEmpty( b1Author ) &&


    ???????????????
    StringUtils.isNotEmpty( b2Author ) ) {


    ???????????????
    comparison = b1Author.compareTo( b2Author );


    ???????????
    }??


    ???????
    }


    ???????
    return comparison;


    ???
    }


    }


    ???該事例是對一個稱為
    book bean 進行排序,將會根據 name author

    兩個屬性進行排序。當我們使用的時候,就可以類似于以下的形式。


    ?????Arrary.sort(books,BookComparator)
    或者 collections.sort

    (books,BookComparator).
    當中的兩個參數是要排序的數組或者 list 以及使

    用的
    Comparator 。下邊主要說的就是怎樣構造 Comparator


    本文的是展示怎樣使用
    commons 的組件,來完成 Comparator 的構造。


    對單一
    bean 的單個屬性排序


    ??????
    現在如果我們只是想對 bean 中的一個屬性進行排序的話。那么只需要構造

    出一個
    BeanComparator 的實例就可以了 .


    形式如下:
    ?

    private BeanComparator comparator = new BeanComparator("name");


    ??????
    這樣子我們就構造出了一個根據 ”name” 屬性來對集合中的 bean 進行排

    序的比較器。當集合中的
    bean name 這個屬性的時候,那么排序時就會依照

    這個排序器來調整集合中
    bean 的順序。


    ????BeanComparator
    BeanUtils API 中的一個類,使用它可以很簡單地根

    bean 的屬性對 Bean 類進行排序。


    ??????
    需要說明的是這個比較器只是對符合 javabean 規范的類進行比較,如果類

    中沒有這個屬性或者屬性沒有
    get set 方法,那么在比較的時候就會拋出

    ClassCastException


    裝飾比較器


    ??????
    上邊生成的比較器是帶有一些默認的排序規則的,比如按著自然順序排列,

    當遇到字符串的值是“”的時候就排列在前端。下邊我將說明怎么改變這種默認

    的規則。


    ??????
    為了完成這個任務,我們就需要使用 commons.collections.comparators

    提供的幾個裝飾類,ReverseComparatorNullComparator

    FixedOrderComparator
    或者ComparatorUtils這個實用類。



    ???
    下邊分別說明反序排列,允許空值排列和自定義順序排列的實現方法。


    ???
    當我們想對讓一個比較器按著反序進行排列的時候,可以使用如下的形

    式:


    ??????comparator = new ReverseComparator(comparator);


    ??????
    需要說明的是:這個功能的實現可以在排完序后對要排序的 array 或者

    list
    調用其 reverse ()方法即可。但是這種做法并不適合下邊談到的對

    bean
    的多字段排序時,而只對某一個字段逆序的情況。?

    ???  當對一個比較器進行特定順序排列時需要用到FixedOrderComparator

    這個類用于定義一個特殊的順序,對一組對象按照這樣的自定義順序進行排序。

    具體的事例如下:

    String[] severityOrder = { "Critical", "Minor", "Enhancement" };

    Comparator severityComparator = new FixedOrderComparator    (severityOrder);

    Comparator comparator=new BeanComparator("title",severityComparator)

    如上的程序便可以對 bean title 屬性按著數組中特定

    的順序進行排序!

    最后需要說明的是,以上談到的幾個裝飾在 ComparatorUtils 這個實用類中也提供了支持。

    具體使用如下:

    按著 bean 的屬性為 null 時進行排序,可以選擇屬性為 null 時排在前邊還是后邊!

    ComparatorUtils.nullLowComparator(comparator);? 或者 ComparatorUtils.nullHighComparator(comparator);

    當對一個排序器逆序時:

    ComparatorUtils.reversedComparator(mycmp); // 逆序

    ?

    多個屬性的排序

    當我們想對 bean 的多個屬性進行排序的時候,需要用到 commons.collections. ComparatorChain 。這個類 定義一組Comparator鏈,鏈中的Comparator對象會被依次執行。我們可以通過該類的 addComparator() 方法進行將當個的 comparator 對象加入到 comparator 鏈中,當使用的時候就可以和使用單個 comparator 一樣。因為 comparatorChain 也繼承了 comparator 的借口。當我們添加單個的 comparator 的時候,就可以利用上邊談到的對 comparator 進行裝飾。

    ComparatorChain comparatorChain = new ComparatorChain( );

    comparatorChain.addComparator( new BeanComparator( "name" ) );

    comparatorChain.addComparator( new BeanComparator( "author" ) );

    comparaterChain.addComparator( new ReverseComparator?????????????????????????????                           (new BeanComparator("author") );

    ??? ? 具體使用的時候如下:

    ????Arrays.sort( books, comparatorChain );

    ? 這個樣子就可以將這個 comparator 傳給 sort ()方法。當談到對 bean 的多字段排序,而只對某一個字段逆序的情況時,可以參考如下的實現。

    ???? ?ComparatorChain comparatorChain = new ComparatorChain( );

    ???? comparatorChain.addComparator( new BeanComparator( "name" ) );

    ????? ? 這樣子就可以實現了對 bean name 按著正序排列而對 author 屬性按著逆序排列。

    對組合 bean 進行排序

    ???? ? 當一個 bean 的某個屬性是另外一個 java bean 的時候,而我們有想按著那個被組合進來 bean 的某個屬性進行排序的時候,我們只需要很簡單的將 BeanComparator 的參數設定成 bean.property 的形式,比如想對按著 book author 中的 title 屬性進行排序的時候就可以參考以下的形式:

    new BeanComparator

    ("author.title",severityComparator))

    Comparable 接口的實現

    ???? ? 最后如果想對 author 類實現 Comparable 接口可以參考如下的實現:

    public class Book implements Comparable {

    public int compareTo(Object arg0) {

    // comparators setup

    String[] severityOrder = { "Critical", "Major", "Minor", "Enhancement" };

    // 用于定義一個特殊的順序,對一組對象按照這樣的自定義順序進行排序;

    Comparator severityComparator = new FixedOrderComparator(severityOrder);

    ComparatorChain compChain = new ComparatorChain();

    ?????? // 通過為屬性指定一個已經存在的 Comparator ,而非采用默認的自然順序

    compChain.addComparator(new BeanComparator("author.

    title", severityComparator));

    ??? ?compChain.addComparator(new NullComparator

    (new BeanComparator("name"), true));

    compChain .addComparator(new ReverseComparator

    (new BeanComparator("id")));

    ??? ?return compChain.compare(this, arg0);

    ??? }

    }

    ?? 另外一個實現思路是:利用 commons.lang.compareBulder 實現。但是卻失去了以上的裝飾功能!

    ?

    ?

    ?? 最后需要說明的是,由于我在工作中最近用到這些排序,所以整理了一下,希望對您有用。同時參考了很多網上的資料,謝!
    ??

      事例代碼我放到了: commons2006@126.com , 密碼是 commons2006

    ?

    ?

    posted on 2006-09-16 16:33 張氏兄弟 閱讀(1159) 評論(1)  編輯  收藏

    評論:
    # re: 關于排序 2006-09-20 13:09 | 壞男孩
    哥們,加個友情鏈接吧  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 免费无遮挡无码视频在线观看| 91精品成人免费国产| 国产yw855.c免费视频| 成人网站免费大全日韩国产 | 亚洲男人天堂2020| 99久热只有精品视频免费观看17| 亚洲s码欧洲m码吹潮| 国产亚洲高清不卡在线观看| 日韩毛片免费无码无毒视频观看| 深夜免费在线视频| 亚洲性69影院在线观看| 亚洲精品无码AV中文字幕电影网站| 久久国产精品一区免费下载| 久久水蜜桃亚洲AV无码精品| 久久亚洲精品无码AV红樱桃| 免费夜色污私人影院在线观看| 精品国产免费人成电影在线观看| 老司机午夜性生免费福利| 久久久久亚洲AV无码网站| 亚洲狠狠爱综合影院婷婷| 国产一卡2卡3卡4卡2021免费观看 国产一卡2卡3卡4卡无卡免费视频 | 亚洲理论片中文字幕电影| 久久亚洲欧洲国产综合| 无码一区二区三区免费视频| 182tv免费视频在线观看| 亚洲av成人片在线观看| 亚洲图片校园春色| 亚洲成在人线av| 亚洲精品成人a在线观看| 岛国av无码免费无禁网站| 日韩电影免费观看| 好男人资源在线WWW免费| 美美女高清毛片视频黄的一免费| 亚洲人成在线免费观看| 亚洲AV美女一区二区三区| 久久精品国产亚洲Aⅴ香蕉| 免费国产小视频在线观看| 成年男女男精品免费视频网站 | 亚洲AV无码一区二区三区在线观看 | 亚洲mv国产精品mv日本mv| 一区二区三区亚洲|