java基礎之Comparator和Comparable

hogen發表於2017-12-29

Comparable

Comparable 是 java.lang 包下的一個排序介面,該介面對實現它的每個類的物件強加一個整體排序。 該排序稱為類的自然排序,類的compareTo方法稱為自然比較方法。

//定義Bean物件並實現Comparable介面
class Person implements Comparable<Object>{
    private int id;
    private String name;
    ....set、get、構造方法
    @Override
    public int compareTo(Object o) {
        Person p = (Person)o;
        return this.id-p.id;
    }
}
複製程式碼

//比較輸出
public static void main(String[] args) {
    ArrayList<Person> arrayList = new ArrayList<Person>();
    // 不能寫成:Collection c = new ArrayList();
    // 這會導致49行出錯,因為Collections.sort()接受的形參必須的是List介面型別的變數,
    // Collections.sort()不能接受Collection型別的變數,這語法上編譯時是通不過的
    arrayList.add(new Person(1000, "張思"));
    arrayList.add(new Person(1002, "李四"));
    arrayList.add(new Person(1001, "王五"));
    arrayList.add(new Person(1004, "小娟"));
    arrayList.add(new Person(1008, "老謝"));
    for (int i = 0; i < arrayList.size(); i++) {
        System.out.println(arrayList.get(i));
    }
    java.util.Collections.sort(arrayList);//49行
    System.out.println("排序之後的內容是:");
    Iterator<Person> iterator = arrayList.iterator();
    while (iterator.hasNext()) {
        System.out.println(iterator.next());
    }
}
複製程式碼

Comparator

Comparator 是 java.util 包下的一個比較介面,我們若需要控制某個類的次序,而該類本身不支援排序(即沒有實現 Comparable 介面);那麼,我們可以建立一個“該類的比較器”來進行排序。這個“比較器”只需要實現 Comparator 介面即可。

//首先定義一個 Bean 物件
public class Student{
    private int id;
    private String name;
    ....set、get、構造方法
}
複製程式碼

//定義一個 MyComparator 類並實現 Comparator 介面
public class MyComparator implements Comparator<Student>{
    @Override
    public int compare(Student s1, Student s2) {
        return s1.getId()-s2.getId();
    }
}
複製程式碼

//對於Set集合的實現類,在主方法中做比較輸出
public static void main(String[] args) {
    Set<Student> set = new TreeSet<Student>(new MyComparator());
    set.add(new Student(1002, "張三"));
    set.add(new Student(1001, "李四"));
    set.add(new Student(1005, "王五"));
    set.add(new Student(1004, "唐人"));
    set.add(new Student(1008, "但丁"));
    set.add(new Student(1007, "林俊杰"));
    set.add(new Student(1009, "李逸"));

    for (Student student : set) {
        System.out.println(student);
    }
}
複製程式碼

//對於List集合的實現類,在主方法中做比較輸出
public static void main(String[] args) {
    List<Student> list = new ArrayList<Student>();
    list.add(new Student(1002, "張三"));
    list.add(new Student(1001, "李四"));
    list.add(new Student(1005, "熊志"));
    list.add(new Student(1004, "唐人"));
    list.add(new Student(1008, "但丁"));
    list.add(new Student(1007, "林俊杰"));
    list.add(new Student(1009, "李逸"));
    Collections.sort(list, new MyComparator());//第一個引數須是List集合的實現類
    Iterator<Student> it = list.iterator();
    while(it.hasNext()){
        System.out.println(it.next());
    }
}
複製程式碼

相關文章