Arrays和Collections的sort方法[轉]

http://blog.sina.com.cn/s/blog_4fb846a90100d8q0.html

 

對象排序之Comparator,Comparable接口區別:
comparable是通用的接口,用戶可以實現它來完成自己特定的比較,而comparator可以看成一種算法的實現,在需要容器集合 collection需要比較功能的時候,來指定這個比較器,這可以看出一種設計模式,將算法和數據分離,就像C++ STL中的函數對象一樣。
  前者應該比較固定,和一個具體類相綁定,而後者比較靈活,它可以被用於各個需要比較功能的類使用。可以說前者屬於“靜態綁定”,而後者可以“動態綁定”。
  一個類實現了Camparable接口表明這個類的對象之間是可以相互比較的。如果用數學語言描述的話就是這個類的對象組成的集合中存在一個全序。這樣,這個類對象組成的集合就可以使用Sort方法排序了。
  而Comparator的作用有兩個:
  1,如果類的設計師沒有考慮到Compare的問題而沒有實現Comparable接口,可以通過Comparator來實現比較算法進行排序
  2,爲了使用不同的排序標準做準備,比如:升序、降序或其他什麼序

 

首先要知道兩個類:java.util.Arrays和java.util.Collections(注意和Collection的區別)Collection是集合框架的頂層接口,而Collections是包含了許多靜態方法。我們使用Arrays對數組進行排序,使用Collections對結合框架容器進行排序,如ArraysList,LinkedList等。

對數組進行排序
對基本數據類型(primitive type)或String類型的數組進行排序
 int[] intArray = new int[] {4, 1, 3, -23};
    Arrays.sort(intArray);
    // [-23, 1, 3, 4]
   
    String[] strArray = new String[] {"z", "a", "C"};
    Arrays.sort(strArray);
    // [C, a, z]
   
    // Case-insensitive sort
    Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
    // [a, C, z]
   
    // Reverse-order sort
    Arrays.sort(strArray, Collections.reverseOrder());
    // [z, a, C]
   
    // Case-insensitive reverse-order sort
    Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
    Collections.reverse(Arrays.asList(strArray));
    // [z, C, a]
當然我們也可以指定數組的某一段進行排序比如我們要對數組下表0-2的部分(假設數組長度大於3)進行排序,其他部分保持不變,我們可以使用:
    Arrays.sort(strArray,0,2);
這樣,我們只對前三個元素進行了排序,而不會影響到後面的部分。

對對象數組進行排序
這個數組的自然順序是未知的,因此我們需要爲該類實現Comparable接口
Name類
public class Name implements Comparable<Name>{
 public String firstName, lastName;
  
 public Name(String firstName,String lastName){
          this.firstName=firstName;
          this.lastName=lastName;
      }
     public int compareTo(Name o) {          //實現接口
          int lastCmp=lastName.compareTo(o.lastName);
          return (lastCmp!=0?lastCmp:firstName.compareTo(o.firstName));
      }   
     public String toString(){                //便於輸出測試
          return firstName+" "+lastName;
      }
}
這樣,當我們對這個對象數組進行排序時,就會先比較lastName,然後比較firstName 然後得出兩個對象的先後順序,就像compareTo(Name o)裏實現的那樣

用程序進行測試
NameSort類
import java.util.*;
public class NameSort {
 public static void main(String[] args) {
  // TODO Auto-generated method stub
   Name[] nameArray = new Name[]{
                new Name("John", "Lennon"),
                new Name("Karl", "Marx"),
                new Name("Groucho", "Marx"),
                new Name("Oscar", "Grouch")
            };
            Arrays.sort(nameArray);
            for(int i=0;i<nameArray.length;i++){
                System.out.println(nameArray[i].toString());
            }
 }
}

對集合框架進行排序
如果已經理解了Arrays.sort()對數組進行排序的話,集合框架的使用也是大同小異。只是將Arrays替換成了Collections,注意Collections是一個類而Collection是一個接口.
假如有這樣一個鏈表:
    LinkedList list=new LinkedList();
    list.add(4);
    list.add(34);
    list.add(22);
    list.add(2);
我們只需要使用:
    Collections.sort(list);
就可以將ll裏的元素按從小到大的順序進行排序,結果就成了:
    [2, 4, 22, 34]
如果LinkedList裏面的元素是String,同樣會想基本數據類型一樣從小到大排序。
如果要實現反序排序也就是從大到小排序:
    Collections.sort(list,Collectons.reverseOrder());
如果LinkedList裏面的元素是自定義的對象,可以像上面的Name對象一樣實現Comparable接口,就可以讓Collection.sort()爲您排序了。

對對象進行自定義排序
可以使用sort(List<T> list, Comparator<? super T> c)這個方法進行排序,
FIRST_NAME_ORDER類
import java.util.*;
public class FIRST_NAME_ORDER implements Comparator<Name>{
 public int compare(Name n1, Name n2) {
        int firstCmp=n1.firstName.compareTo(n2.firstName);
        return (firstCmp!=0?firstCmp:n1.lastName.compareTo
                (n2.firstName));
 }
}

在上面的NameSort中將 Arrays.sort(nameArray);替換成下面語句
List<Name> list=Arrays.asList(nameArray); //將名字數組轉化爲List
Collections.sort(list,new FIRST_NAME_ORDER());


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章