The NoteBook of EricKong

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

          說(shuō)到現(xiàn)在,讀者應(yīng)該對(duì)Comparable接口有了大概的了解,但是為什么又要有一個(gè)Comparator接口呢?難道Java的開(kāi)發(fā)者都吃飽撐著沒(méi)事做嗎?

          再談Comparator接口之前,大家應(yīng)該先了解一個(gè)叫“策略模式”的東東。一下是百度百科對(duì)策略模式的描寫:

          策略模式定義了一系列的算法,并將每一個(gè)算法封裝起來(lái),而且使它們還可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)

           

          之所以要談到策略模式,就是因?yàn)镃omparator接口其實(shí)就是一種策略模式的實(shí)踐。實(shí)現(xiàn)Comparator接口的類必然就會(huì)實(shí)現(xiàn)一個(gè)compareTo(Object o1, Object o2)的方法,而這個(gè)方法就是算法中的一部分,所有使用了compareTo方法的類都不會(huì)關(guān)心compareTo是如何工作的,只關(guān)心他的返回值,這也是面向?qū)ο笾兄姆庋b特性。

          那Comparator接口應(yīng)該如何使用呢?別急,首先我們要先對(duì)Person類進(jìn)行一下處理,因?yàn)槲覀儸F(xiàn)在使用Comparator接口,所以Comparable接口就可以光榮的退休了:

             1: public class Person {
             2:  
             3:     private String name;
             4:     private int age;
             5:     
             6:     public Person() {
             7:         
             8:     }
             9:     
            10:     public Person(String name, int age) {
            11:         this.name = name;
            12:         this.age = age;
            13:     }
            14:  
            15:     public String getName() {
            16:         return name;
            17:     }
            18:  
            19:     public void setName(String name) {
            20:         this.name = name;
            21:     }
            22:  
            23:     public int getAge() {
            24:         return age;
            25:     }
            26:  
            27:     public void setAge(int age) {
            28:         this.age = age;
            29:     }
            30:  
            31:     @Override
            32:     public String toString() {
            33:         return "Person [age=" + age + ", name=" + name + "]";
            34:     }
            35:  
            36: }

          新建一個(gè)實(shí)現(xiàn)Comparator的實(shí)現(xiàn)類PersonComparator:

             1: import java.util.Comparator;
             2:  
             3: public class PersonComparator implements Comparator<Person> {
             4:  
             5:     @Override
             6:     public int compare(Person p1, Person p2) {
             7:         if (p1.getAge() > p2.getAge()) {
             8:             return 1;
             9:         } else if (p1.getAge() < p2.getAge()) {
            10:             return -1;
            11:         }
            12:         return 0;
            13:     }
            14:     
            15: }

          然后再用回我們的CompareTest做測(cè)試:

             1: import java.util.Arrays;
             2:  
             3: public class CompareTest {
             4:  
             5:     public static void main(String[] args) {
             6:         Person[] persons = {
             7:                 new Person("P1", 60),
             8:                 new Person("P2", 20),
             9:                 new Person("P3", 40)
            10:         };
            11:         
            12:         System.out.println(Arrays.toString(persons));
            13:         
            14:         Arrays.sort(persons, new PersonComparator());
            15:         
            16:         System.out.println(Arrays.toString(persons));
            17:     }
            18:  
            19: }

          注意:在上面的sort方法中,我們傳進(jìn)了一個(gè)PersonComparator的實(shí)例對(duì)象作為參數(shù),讀者也可以試試不傳入這個(gè)參數(shù),看是否能正確工作。

          結(jié)果當(dāng)然是跟上面演示的例子一樣啦,我就不再重復(fù)了。

          posted on 2011-04-12 12:26 Eric_jiang 閱讀(3589) 評(píng)論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 青阳县| 台北市| 阿坝| 无锡市| 宜黄县| 四子王旗| 衡南县| 抚远县| 辉县市| 太白县| 昌吉市| 洪洞县| 奈曼旗| 牙克石市| 宜兴市| 泗阳县| 宜阳县| 宜都市| 池州市| 钦州市| 南投县| 突泉县| 陈巴尔虎旗| 盖州市| 奉贤区| 涞源县| 通渭县| 珠海市| 绵阳市| 漳浦县| 崇明县| 日土县| 莲花县| 城口县| 青田县| 临夏市| 秦安县| 孟津县| 贵定县| 彰化市| 历史|