posts - 241,  comments - 116,  trackbacks - 0
          1. 兩種比較接口分析
          在 “ 集合框架 ” 中有兩種比較接口: Comparable 接口和 Comparator 接口。 Comparable 是通用的接口,用戶可以實現它來完成自己特定的比較,而 Comparator 可以看成一種算法的實現,在需要容器集合實現比較功能的時候,來指定這個比較器,這可以看成一種設計模式,將算法和數據分離。你選擇咖啡還是奶茶
          前者應該比較固定,和一個具體類相綁定,而后者比較靈活,它可以被用于各個需要比較功能的類使用。
          一個類實現了 Camparable 接口表明這個類的對象之間是可以相互比較的。如果用數學語言描述的話就是這個類的對象組成的集合中存在一個全序。這樣,這個類對象組成的集合就可以使用 Sort 方法排序了。
          而 Comparator 的作用有兩個:
          1 、如果類的設計師沒有考慮到 Compare 的問題而沒有實現 Comparable 接口,可以通過 Comparator 來實現比較算法進行排序;
          2 、為了使用不同的排序標準做準備,比如:升序、降序或其他什么序。
          2 Comparable 接口
          public interface Comparable<T> {
              public int compareTo(T o);
          }
          java.lang. Comparable 接口定義類的自然順序,實現該接口的類就可以按這種方式排序。  
          1 ) int compareTo(Object o): 比較當前實例對象與對象 o ,如果位于對象 o 之前,返回負值,如果兩個對象在排序中位置相同,則返回 0 ,如果位于對象 o 后面,則返回正值。
           
          2 )在 Java 2 SDK 版本 1.4 中有二十四個類實現 Comparable 接口。下表展示了 8 種基本類型的自然排序。雖然一些類共享同一種自然排序,但只有相互可比的類才能排序。
          排序
          BigDecimal,BigInteger,Byte,Double, Float,Integer,Long,Short
          按數字大小排序
          Character
          按 Unicode 值的數字大小排序
          String
          按字符串中字符 Unicode 值排序
          利用 Comparable 接口創建自己的類的排序順序,只是實現 compareTo() 方法的問題。通常就是依賴幾個數據成員的自然排序。同時類也應該覆蓋 equals() 和 hashCode() 以確保兩個相等的對象返回同一個哈希碼。
          這個接口的作用:如果數組或者集合中的(類)元素實現了該接口的話 , 我們就可以調用 Collections.sort 和 Arrays.sort 排序,或應用于有序集合 TreeSet 和 TreeMap 中。
          下面設計一個有序的類 Person ,它實現 Comparable 接口,以年齡為第一關鍵字,姓名為第二關鍵字升序排序。
          Person.java
          package com.zj.sort.comparable;
           
          public class Person implements Comparable<Person> {
              private int age ;
              private String name ;
           
              public Person( int age, String name) {
                 this . age = age;
                 this . name = name;
              }
           
              public int compareTo(Person person) {
                 int cop = age - person.getAge();
                 if (cop != 0)
                     return cop;
                 else
                     return name .compareTo(person. name );
              }
           
              public int getAge() {
                 return age ;
              }
           
              public String getName() {
                 return name ;
              }
           
              public int hashCode() {
                 int result = 17;
                 result = 37 * result + age ;
                 result = 37 * result + name .hashCode();
                 return result;
              }
           
              public boolean equals(Object o) {
                 if (!(o instanceof Person))
                     return false ;
                 Person person = (Person) o;
                 return ( age == person. age ) && ( name .equals(person. name ));
              }
           
              public String toString() {
                 return ( age + "{" + name + "}" );
              }
          }
          2.1 測試 Arrays.sort ()方法
          ArraysSortUnit.java
          package com.zj.sort.comparable;
          import java.util.Arrays;
          import com.zj.compare.Person;
           
          public class ArraysSortUnit {
              public static void main(String[] args) {
                 Person[] ps = { new Person(20, "Tom" ), new Person(20, "Jeff" ),
                        new Person(30, "Mary" ), new Person(20, "Ada" ),
                        new Person(40, "Walton" ), new Person(61, "Peter" ),
                        new Person(20, "Bush" ) };
                 System. out .println(Arrays.toString (ps));
                 Arrays.sort (ps);
                 System. out .println(Arrays.toString (ps));
              }
          }
          結果:
          [20{Tom}, 20{Jeff}, 30{Mary}, 20{Ada}, 40{Walton}, 61{Peter}, 20{Bush}]
          [20{Ada}, 20{Bush}, 20{Jeff}, 20{Tom}, 30{Mary}, 40{Walton}, 61{Peter}]
          2.2 測試 Collections.sort ()方法
          CollctionsSortUnit.java
          package com.zj.sort.comparable;
          import java.util.Arrays;
          import java.util.Collections;
          import com.zj.compare.Person;
           
          public class CollctionsSortUnit {
              public static void main(String[] args) {
                 Person[] ps = { new Person(20, "Tom" ), new Person(20, "Jeff" ),
                        new Person(30, "Mary" ), new Person(20, "Ada" ),
                         new Person(40, "Walton" ), new Person(61, "Peter" ),
                        new Person(20, "Bush" ) };
                 System. out .println(Arrays.toString (ps));
                 Collections.sort (Arrays.asList (ps));
                 System. out .println(Arrays.toString (ps));
              }
          }
          結果:
          [20{Tom}, 20{Jeff}, 30{Mary}, 20{Ada}, 40{Walton}, 61{Peter}, 20{Bush}]
          [20{Ada}, 20{Bush}, 20{Jeff}, 20{Tom}, 30{Mary}, 40{Walton}, 61{Peter}]
          2.3 測試 TreeSet
          TreeSetUnit.java
          package com.zj.sort.comparable;
          import java.util.TreeSet;
          import com.zj.compare.Person;
           
          public class TreeSetUnit {
              public static void main(String[] args) {
                 TreeSet<Person> set = new TreeSet<Person>();
                 set.add( new Person(20, "Tom" ));
                 set.add( new Person(20, "Jeff" ));
                 set.add( new Person(30, "Mary" ));
                 set.add( new Person(20, "Ada" ));
                 set.add( new Person(40, "Walton" ));
                 set.add( new Person(61, "Peter" ));
                 set.add( new Person(20, "Bush" ));
                 System. out .println(set);
              }
          }
          結果:
          [20{Ada}, 20{Bush}, 20{Jeff}, 20{Tom}, 30{Mary}, 40{Walton}, 61{Peter}]
          2.4 測試 TreeMap
          TreeMapUnit.java
          package com.zj.sort.comparable;
          import java.util.TreeMap;
          import com.zj.compare.Person;
           
          public class TreeMapUnit {
              public static void main(String[] args) {
                 TreeMap<Person, String> map = new TreeMap<Person, String>();
                 map.put( new Person(20, "Tom" ), "Tom" );
                 map.put( new Person(20, "Jeff" ), "Jeff" );
                 map.put( new Person(30, "Mary" ), "Mary" );
                 map.put( new Person(20, "Ada" ), "Ada" );
                 map.put( new Person(40, "Walton" ), "Walton" );
                 map.put( new Person(61, "Peter" ), "Peter" );
                 map.put( new Person(20, "Bush" ), "Bush" );
                 System. out .println(map);
              }
          }
          結果:
          {20{Ada}=Ada, 20{Bush}=Bush, 20{Jeff}=Jeff, 20{Tom}=Tom, 30{Mary}=Mary, 40{Walton}=Walton, 61{Peter}=Peter}
          3. Comparator 接口
          public interface Comparator<T> {
              int compare(T o1, T o2);
              boolean
          posted on 2011-10-24 09:36 墻頭草 閱讀(8890) 評論(1)  編輯  收藏

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


          網站導航:
           
          人人游戲網 軟件開發網 貨運專家
          主站蜘蛛池模板: 百色市| 香河县| 乌审旗| 舞阳县| 平利县| 丘北县| 霍山县| 瑞安市| 佛冈县| 洛扎县| 青海省| 都江堰市| 泾川县| 迭部县| 山东省| 阳高县| 曲靖市| 会同县| 永清县| 廉江市| 海伦市| 类乌齐县| 武城县| 康乐县| 阜新市| 新密市| 弥勒县| 湖口县| 喜德县| 元氏县| 介休市| 昌邑市| 厦门市| 蕲春县| 周口市| 郁南县| 长寿区| 大悟县| 阿拉善左旗| 达州市| 胶州市|