Java快速開發(fā)平臺(tái)

          www.fastunit.com

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            23 Posts :: 0 Stories :: 273 Comments :: 0 Trackbacks

          當(dāng)需要排序的集合或數(shù)組不是單純的數(shù)字型時(shí),通常可以使用Comparator或Comparable,以簡單的方式實(shí)現(xiàn)對(duì)象排序或自定義排序。

          一、Comparator

          強(qiáng)行對(duì)某個(gè)對(duì)象collection進(jìn)行整體排序的比較函數(shù),可以將Comparator傳遞給Collections.sort或Arrays.sort。

          接口方法:

            /**
             * 
          @return o1小于、等于或大于o2,分別返回負(fù)整數(shù)、零或正整數(shù)。
             
          */
            
          int compare(Object o1, Object o2);

          案例:

          import java.util.Arrays;
          import java.util.Comparator;

          public class SampleComparator implements Comparator {

            
          public int compare(Object o1, Object o2) {
              
          return toInt(o1) - toInt(o2);
            }

            
          private int toInt(Object o) {
              String str 
          = (String) o;
              str 
          = str.replaceAll("""1");
              str 
          = str.replaceAll("""2");
              str 
          = str.replaceAll("""3");
              
          // 
              return Integer.parseInt(str);
            }

            
          /**
             * 測試方法
             
          */
            
          public static void main(String[] args) {
              String[] array 
          = new String[] { "一二""""" };
              Arrays.sort(array, 
          new SampleComparator());
              
          for (int i = 0; i < array.length; i++) {
                System.out.println(array[i]);
              }
            }

          }

           二、Comparable

          強(qiáng)行對(duì)實(shí)現(xiàn)它的每個(gè)類的對(duì)象進(jìn)行整體排序,實(shí)現(xiàn)此接口的對(duì)象列表(和數(shù)組)可以通過Collections.sort或Arrays.sort進(jìn)行自動(dòng)排序。

          接口方法:

            /**
             * 
          @return 該對(duì)象小于、等于或大于指定對(duì)象o,分別返回負(fù)整數(shù)、零或正整數(shù)。 
             
          */
            
          int compareTo(Object o);

          假設(shè)對(duì)象User,需要按年齡排序:

          public class User {

            
          private String id;
            
          private int age;

            
          public User(String id, int age) {
              
          this.id = id;
              
          this.age = age;
            }

            
          public int getAge() {
              
          return age;
            }

            
          public void setAge(int age) {
              
          this.age = age;
            }

            
          public String getId() {
              
          return id;
            }

            
          public void setId(String id) {
              
          this.id = id;
            }

          }

          改造后的對(duì)象:

          import java.util.Arrays;

          public class User implements Comparable {

            
          private String id;
            
          private int age;

            
          public User(String id, int age) {
              
          this.id = id;
              
          this.age = age;
            }

            
          public int getAge() {
              
          return age;
            }

            
          public void setAge(int age) {
              
          this.age = age;
            }

            
          public String getId() {
              
          return id;
            }

            
          public void setId(String id) {
              
          this.id = id;
            }

            
          public int compareTo(Object o) {
              
          return this.age - ((User) o).getAge();
            }

            
          /**
             * 測試方法
             
          */
            
          public static void main(String[] args) {
              User[] users 
          = new User[] { new User("a"30), new User("b"20) };
              Arrays.sort(users);
              
          for (int i = 0; i < users.length; i++) {
                User user 
          = users[i];
                System.out.println(user.getId() 
          + " " + user.getAge());
              }
            }

          }


          三、Comparator和Comparable的區(qū)別

          先看一下使用Comparator對(duì)User集合實(shí)現(xiàn)排序的方式:

          import java.util.Arrays;
          import java.util.Comparator;

          public class UserComparator implements Comparator {

            
          public int compare(Object o1, Object o2) {
              
          return ((User) o1).getAge() - ((User) o2).getAge();
            }

            
          /**
             * 測試方法
             
          */
            
          public static void main(String[] args) {
              User[] users 
          = new User[] { new User("a"30), new User("b"20) };
              Arrays.sort(users, 
          new UserComparator());
              
          for (int i = 0; i < users.length; i++) {
                User user 
          = users[i];
                System.out.println(user.getId() 
          + " " + user.getAge());
              }
            }

          }

          一個(gè)類實(shí)現(xiàn)了Camparable接口則表明這個(gè)類的對(duì)象之間是可以相互比較的,這個(gè)類對(duì)象組成的集合就可以直接使用sort方法排序。
          Comparator可以看成一種算法的實(shí)現(xiàn),將算法和數(shù)據(jù)分離,Comparator也可以在下面兩種環(huán)境下使用:
          1、類的設(shè)計(jì)師沒有考慮到比較問題而沒有實(shí)現(xiàn)Comparable,可以通過Comparator來實(shí)現(xiàn)排序而不必改變對(duì)象本身
          2、可以使用多種排序標(biāo)準(zhǔn),比如升序、降序等

          posted on 2008-04-08 18:16 FastUnit 閱讀(47208) 評(píng)論(16)  編輯  收藏 所屬分類: Java

          Feedback

          # re: Comparator和Comparable在排序中的應(yīng)用 2008-04-10 11:30 隔葉黃鶯
          博主還是沒有解釋一下,
          int compareTo(Object o);
          返回 負(fù)數(shù)、零、正數(shù)
          意味著什么?平白看去只不過是返回一個(gè)整數(shù)而已。  回復(fù)  更多評(píng)論
            

          # re: Comparator和Comparable在排序中的應(yīng)用 2008-04-11 13:56 FastUnit
          接口方法的注釋中已經(jīng)說明了,分別對(duì)應(yīng)為小于、等于或大于指定對(duì)象。  回復(fù)  更多評(píng)論
            

          # re: Comparator和Comparable在排序中的應(yīng)用 2008-04-12 10:48 豆抓搜索
          代碼寫的好..http://www.douzhua.com  回復(fù)  更多評(píng)論
            

          # re: Comparator和Comparable在排序中的應(yīng)用 2008-04-12 12:53 隔葉黃鶯
          1 3 2
          3比1返回1意味著要做什么
          2比3返回-1又意味著要做什么  回復(fù)  更多評(píng)論
            

          # re: Comparator和Comparable在排序中的應(yīng)用 2008-04-13 13:14 FastUnit
          3比1返回1,意味著3比1大,Comparator和Comparable的接口僅需比較出兩個(gè)對(duì)象的大小,排序的實(shí)現(xiàn)是由Collections.sort()和Arrays.sort()提供的。  回復(fù)  更多評(píng)論
            

          # re: Comparator和Comparable在排序中的應(yīng)用 2008-04-24 00:35 隔葉黃鶯
          Collections.sort() 是調(diào)用了 Arrays.sort() 方法
          排序后的效果就是要保證 [i-1].compare([i]) <=0,就是在 [i-1].compare([i]) >0 時(shí)交換順序。

          換個(gè)角度理解就是他總是保持某種意義上的升序排列方式,讓前一個(gè)對(duì)象與后一個(gè)對(duì)象相比是小于零的(-1)  回復(fù)  更多評(píng)論
            

          # re: Comparator和Comparable在排序中的應(yīng)用 2008-04-24 10:03 FastUnit
          @隔葉黃鶯
          是的,很贊同您探討問題的態(tài)度,了解Collections.sort和Arrays.sort可以更深入的理解Comparator和Comparable是如何應(yīng)用的,很多時(shí)候直接看jdk源碼可以把事情看得更明白。  回復(fù)  更多評(píng)論
            

          # re: Comparator和Comparable在排序中的應(yīng)用 2009-02-04 16:02 thebye85
          學(xué)習(xí)了。  回復(fù)  更多評(píng)論
            

          # re: Comparator和Comparable在排序中的應(yīng)用 2009-02-18 09:28 greathjt
          好,學(xué)習(xí)了,寫的很清楚  回復(fù)  更多評(píng)論
            

          # re: Comparator和Comparable在排序中的應(yīng)用 2009-09-15 19:36 11
          @隔葉黃鶯
            回復(fù)  更多評(píng)論
            

          # re: Comparator和Comparable在排序中的應(yīng)用 2010-06-29 17:33 淘寶網(wǎng)
          選擇默認(rèn)值初始設(shè)置,然后繼續(xù)。  回復(fù)  更多評(píng)論
            

          # re: Comparator和Comparable在排序中的應(yīng)用 2010-07-12 17:02 淘寶網(wǎng)女裝皇冠店
          強(qiáng)行對(duì)某個(gè)對(duì)象collection進(jìn)行整體排序的比較函數(shù),可以將Comparator傳遞給Collections.sort或Arrays.sort。

          接口方法:
            回復(fù)  更多評(píng)論
            

          # re: Comparator和Comparable在排序中的應(yīng)用 2011-08-03 17:49 啊啊啊啊啊啊啊啊啊啊啊
          很好
            回復(fù)  更多評(píng)論
            

          # re: Comparator和Comparable在排序中的應(yīng)用 2012-04-15 13:21 Morris
          thx, 學(xué)習(xí)了  回復(fù)  更多評(píng)論
            

          # re: Comparator和Comparable在排序中的應(yīng)用 2012-09-09 09:49 mazheng3434027@sina.com
          感覺你對(duì)排序不懂。equal方法呢????你怎么沒覆蓋  回復(fù)  更多評(píng)論
            

          # re: Comparator和Comparable在排序中的應(yīng)用[未登錄] 2013-05-07 10:43
          代碼我看懂了,那排序以后的結(jié)果在哪里輸出呢?  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 新闻| 施秉县| 岳普湖县| 台东市| 大连市| 独山县| 搜索| 拉萨市| 安乡县| 保德县| 古田县| 宜良县| 三门峡市| 曲阳县| 谷城县| 夏邑县| 宜宾县| 修武县| 固始县| 紫云| 文山县| 乌拉特前旗| 海南省| 安庆市| 呈贡县| 屏边| 汝南县| 云南省| 高阳县| 嵊泗县| 炉霍县| 青冈县| 涪陵区| 成安县| 台湾省| 梅河口市| 孟州市| 桂东县| 平阴县| 巴青县| 老河口市|