Vincent.Chan‘s Blog

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          網(wǎng)站

          最新評論

          [Jakarta Commons筆記] Commons Collections - Comparator組

          接下來我們會(huì)講到輔助類,首先看Comparator組。

           

          ReverseComparator

          ComparatorChain

          NullComparator

          FixedOrderComparator

          ComparatorUtils

           

          其實(shí)Comparator這個(gè)概念并不是Commons Collections引入的,在標(biāo)準(zhǔn)的Java Collections API中,已經(jīng)明確定了一個(gè)java.util.Comparator接口,只是有很多人并不了解,Commons Collections也只是擴(kuò)展了這個(gè)接口而已。這個(gè)java.util.Comparator定義如下核心方法:

           

          public int compare(Object arg0, Object arg1)

           

          傳給它兩個(gè)對象,它要告訴我們這兩個(gè)對象哪一個(gè)在特定的語義下更“大”,或者兩者相等。如果arg0 > arg1,返回大于0的整數(shù);如果arg0 = arg1,返回0;如果arg0 < arg2,返回小于0的整數(shù)。

           

          我們看看Commons Collections給我們提供了哪些Comparator的實(shí)現(xiàn)類(都在org.apache.commons.collections.comparators包下面):

           

          BooleanComparator – 用于排序一組Boolean對象,指明先true還是先false

          ComparableComparator – 用于排序?qū)崿F(xiàn)了java.lang.Comparable接口的對象(我們常用的Java類如StringIntegerDateDoubleFileCharacter等等都實(shí)現(xiàn)了Comparable接口);

          ComparatorChain – 定義一組Comparator鏈,鏈中的Comparator對象會(huì)被依次執(zhí)行;

          FixedOrderComparator – 用于定義一個(gè)特殊的順序,對一組對象按照這樣的自定義順序進(jìn)行排序;

          NullComparator – null值也可參與比較,可以設(shè)定為先null或者后null

          ReverseComparator – 將原有的Comparator效果反轉(zhuǎn);

          TransformingComparator – 將一個(gè)Comparator裝飾為具有Transformer效果的Comparator

           

          // 有關(guān)Transformer的內(nèi)容會(huì)在以后的筆記中講到。

           

          以上除了ComparatorChain之外,似乎都是實(shí)現(xiàn)一些很基本的比較方法,但是當(dāng)我們用ComparatorChain將一組Comparator串起來之后,就可以實(shí)現(xiàn)非常靈活的比較操作。那么這些Comparator在實(shí)際代碼中如何使用呢?看例子:

           

          /** Issue.java */

           

          package sean.study.commons.collections;

           

          import org.apache.commons.lang.builder.ToStringBuilder;

          import org.apache.commons.lang.builder.ToStringStyle;

           

          public class Issue {

             

              private long id;

              private String severity;

              private String owner;

             

              public Issue() {

              }

             

              public Issue(long id, String severity, String owner) {

                  this.id = id;

                  this.severity = severity;

                  this.owner = owner;

              }

             

              public String toString() {

                  return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)

                          .append("id", id)

                          .append("severity", severity)

                          .append("owner", owner)

                          .toString();

              }

           

              public long getId() {

                  return id;

              }

           

              public void setId(long id) {

                  this.id = id;

              }

           

              public String getOwner() {

                  return owner;

              }

           

              public void setOwner(String owner) {

                  this.owner = owner;

              }

           

              public String getSeverity() {

                  return severity;

              }

           

              public void setSeverity(String severity) {

                  this.severity = severity;

              }

           

          }

           

          /** ComparatorUsage.java */

           

          package sean.study.commons.collections;

           

          import java.util.Arrays;

          import java.util.Comparator;

           

          import org.apache.commons.beanutils.BeanComparator;

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

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

          import org.apache.commons.lang.StringUtils;

           

          public class ComparatorUsage {

           

              public static void main(String[] args) {

                  demoComparator();

              }

             

              public static void demoComparator() {

                  System.out.println(StringUtils.center(" demoComparator ", 40, "="));

                  // data setup

                  Issue[] issues = new Issue[] {

                          new Issue(15102, "Major", "John"),

                          new Issue(15103, "Minor", "Agnes"),

                          new Issue(15104, "Critical", "Bill"),

                          new Issue(15105, "Major", "John"),

                          new Issue(15106, "Major", "John"),

                          new Issue(15107, "Critical", "John"),

                          new Issue(15108, "Major", "Agnes"),

                          new Issue(15109, "Minor", "Julie"),

                          new Issue(15110, "Major", "Mary"),

                          new Issue(15111, "Enhancement", "Bill"),

                          new Issue(15112, "Minor", "Julie"),

                          new Issue(15113, "Major", "Julie")

                  };

                  // comparators setup

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

                  Comparator severityComparator = new FixedOrderComparator(severityOrder);

                  ComparatorChain compChain = new ComparatorChain();

                  compChain.addComparator(new BeanComparator("owner"));

                  compChain.addComparator(new BeanComparator("severity", severityComparator));

                  compChain.addComparator(new BeanComparator("id"));

                  // sort and display

                  Arrays.sort(issues, compChain);

                  for (int i = 0; i < issues.length; i++) {

                      System.out.println(issues[i]);

                  }

                  System.out.println(StringUtils.repeat("=", 40));

              }

             

          }

           

          輸出結(jié)果為:

           

          ============ demoComparator ============

          Issue[id=15108,severity=Major,owner=Agnes]

          Issue[id=15103,severity=Minor,owner=Agnes]

          Issue[id=15104,severity=Critical,owner=Bill]

          Issue[id=15111,severity=Enhancement,owner=Bill]

          Issue[id=15107,severity=Critical,owner=John]

          Issue[id=15102,severity=Major,owner=John]

          Issue[id=15105,severity=Major,owner=John]

          Issue[id=15106,severity=Major,owner=John]

          Issue[id=15113,severity=Major,owner=Julie]

          Issue[id=15109,severity=Minor,owner=Julie]

          Issue[id=15112,severity=Minor,owner=Julie]

          Issue[id=15110,severity=Major,owner=Mary]

          ========================================

           

          我們可以看到,ComparatorChain中的Comparator被依次執(zhí)行,先按name,再按我們自定義的severity次序,再按id,最終我們得到了重新排列的數(shù)組。

           

           

          posted on 2005-08-06 08:40 大胃 閱讀(429) 評論(1)  編輯 收藏 收藏至365Key 所屬分類: On Java

          評論

          # re: [Jakarta Commons筆記] Commons Collections - Comparator組  回復(fù)   

          ReverseComparator
          ComparatorChain
          NullComparator

          是三個(gè)極重要的功能,JDK里面居然不提供標(biāo)準(zhǔn)實(shí)現(xiàn)真是太離譜了,幸虧有Commons

          posted on 2006-03-10 23:14 Vincent.Chen 閱讀(217) 評論(0)  編輯  收藏 所屬分類: Java

          主站蜘蛛池模板: 沅江市| 双城市| 揭东县| 汕头市| 同仁县| 吉木乃县| 崇信县| 信阳市| 滦南县| 浦县| 德令哈市| 华池县| 新建县| 灵台县| 正定县| 万年县| 赤峰市| 乐清市| 十堰市| 开江县| 越西县| 临沧市| 岚皋县| 沾益县| 白水县| 庆阳市| 揭东县| 肇州县| 北辰区| 九龙城区| 西乡县| 嵊州市| 洛扎县| 绍兴市| 九龙县| 汾阳市| 莱芜市| 昌宁县| 竹北市| 集贤县| 石首市|