1. 程式人生 > >Collections工具類中的sort方法

Collections工具類中的sort方法

1.瞭解Collections工具類
Collections工具類是java集合框架的成員,是一種用來操作集合物件的工具類,在Collections類中有一個sort()方法,可以對給定的集合進行排序。集合列表中所有元素都要實現Comparable介面。由於不可使用基本型別作為泛型,我們對它們相應的包裝類進行操作。對以包裝類為泛型的集合的排序,是根據元素的自然順序,對指定列表按升序進行排序。

2.Comparable,Comparator介面
Comparable和Comparator介面,也是java集合框架的成員
Comparable介面給物件定義了預設的比較規則,當一個類實現了這個介面,就說明了該類的例項是可以比較大小的,可以進行自然排序。一旦類實現了Comparable介面,就必須實現compareTo()方法,當類的兩個例項進行比較時,就會呼叫這個方法。該方法返回一個int型別的值,若為正數表示(a對像比b物件)大,負數表示小,0表示相等

Comparator-給物件定義臨時的比較規則,當一個類實現了這個介面,就必須實現compare()方法,可以將comparator傳遞給sort方法,如Collections.sort或者Arrays.sort,也就是可以呼叫Collections.sort方法來使用實現介面的的具體例項。
這裡要注意,在你使用這個方法以後,你的Student類(見下文程式碼)就不需要再實現Comparable介面了。

當使用Collections.sort對指定的集合進行排序以後,預設排序方式為升序。

3.對Integer泛型的List進行排序

public void testSort1(){
    List
<Integer> integerList=new ArratList<Integer>(); Random random=new Random(); Integer k; for(inti=0;i<10;i++){ do{ k=random.nextInt(100); }while(integerList.contains(k));//判斷list中是否包含生成的這個隨機數 integerList.add(k); } Collections.sort(integerList); }

4.對String泛型的List進行排序

public class testSort1(){
    List<String> stringList=new ArrayList<String>();
    stringList.add("microsoft");
    stringList.add("google");
    stringList.add("lenovo");
    Collections.sort(stringList);
}

排序結果為:google,lenovo,microsoft
這裡是按照每一個字串的首字母進行排序的,若首字母相同則比較第二個字母,這樣依次比較,排列順序是先數字(0-9),然後大寫字母(A-Z),然後小寫字母(a-z)

5.對其他型別泛型的List進行排序,以Student為例

public class Student implements Comparable<Student>{
    String id;
    String name;
    public Student(int id,String name){
        this.id=id;
        this.name=name;
    }
    @Override
    public int compareTo(Student o){
        //按照學生id進行排序
        return this.id.compareTo(o.id);
    }
}

public class testSort3(){
    List<Student> studentList =new ArrayList<Student>();
    Random random=new Random();
    studentList.add(newStudent(random.nextInt(1000)+"","Jack"));
    studentList.add(newStudent(random.nextInt(1000)+"","RUB"));
    studentList.add(newStudent(random.nextInt(1000)+"","Dog"));

    Collections.sort(studentList);
}

用上面的方法的比較是不嚴謹的,拋開獲取的隨機數可能會重複這個問題,如果我指定一個id為10000的同學,按照以上的方式排列,那麼排列結果則會是,這位學號1000的同學排在第一位,而它本應該是排到最後的,為什麼會出現這種情況呢,我們id的型別是String,那麼它排序的時候還是按照一位一位的比較,比較第一位的時候,1最小,就排在了第一位。
所以這種比較方法還是應該根據實際情況進行考慮,下面我們來看看另一個介面,以及另一種實現方式。

public class Compara implements Comparator<Student>{
    @Override
    public int compare(Student o1,Student o2){
        return o1.name.compareTo(o2.name);
    }
public class testSort3(){
    List<Student> studentList =new ArrayList<Student>();
    Random random=new Random();
    studentList.add(newStudent(random.nextInt(1000)+"","Jack"));
    studentList.add(newStudent(random.nextInt(1000)+"","RUB"));
    studentList.add(newStudent(random.nextInt(1000)+"","Dog"));

    Collections.sort(studentList,new Compara());
}
}