Comparator 和 Comparable

1. Comparator 和 Comparable 相同的地方

他們都是java的一個接口, 並且是用來對自定義的class比較大小的,

什麼是自定義class: 如 public class Person{ String name; int age }.

當我們有這麼一個personList,裏面包含了person1, person2, persion3…, 我們用Collections.sort( personList ),
是得不到預期的結果的. 這時肯定有人要問, 那爲什麼可以排序一個字符串list呢:

如 StringList{“hello1” , “hello3” , “hello2”}, Collections.sort( stringList ) 能夠得到正確的排序, 那是因爲
String 這個對象已經幫我們實現了 Comparable接口 , 所以我們的 Person 如果想排序, 也要實現一個比較器。

2.Comparator 和 Comparable 的區別

Comparable

Comparable 定義在 Person類的內部:

public class Persion implements Comparable {…比較Person的大小…},

因爲已經實現了比較器,那麼我們的Person現在是一個可以比較大小的對象了,它的比較功能和String完全一樣,可以隨時隨地的拿來
比較大小,因爲Person現在自身就是有大小之分的。Collections.sort(personList)可以得到正確的結果。

Comparator

Comparator 是定義在Person的外部的, 此時我們的Person類的結構不需要有任何變化,如

public class Person{ String name; int age },

然後我們另外定義一個比較器:

public PersonComparator implements Comparator() {…比較Person的大小…},

在PersonComparator裏面實現了怎麼比較兩個Person的大小. 所以,用這種方法,當我們要對一個 personList進行排序的時候,
我們除了了要傳遞personList過去, 還需要把PersonComparator傳遞過去,因爲怎麼比較Person的大小是在PersonComparator
裏面實現的, 如:

Collections.sort( personList , new PersonComparator() ).

public class CompareTest {
    public static void main(String[]args){
        List<Student>list = new ArrayList<Student>(10);
        list.add(new Student(1,"jj"));
        list.add(new Student(0,"kj"));
        list.add(new Student(0,"kk"));
        list.add(new Student(0,"kw"));
        list.add(new Student(2,"ll"));
        System.out.println(list);
        Collections.sort(list);
        System.out.println(list);


        List<Teacher>t = new ArrayList<Teacher>(10);
        t.add(new Teacher(1,12));
        t.add(new Teacher(0,13));
        t.add(new Teacher(0,14));
        t.add(new Teacher(2,15));
        t.add(new Teacher(2,16));
        System.out.println(t);
        Collections.sort(t,new TeacherComparator());
        System.out.println(t);
    }
}

class Student implements Comparable{
    int num;
    String name;

    public Student(int num,String name){
        this.num = num;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "num=" + num +
                ", name='" + name + '\'' +
                '}';
    }

    @Override
    public int compareTo(Object o) {
        Student stu = (Student)o;
        int result = stu.num>num?1:(stu.num==num?0:-1);
        if (result==0){
           // result = stu.name.indexOf(0)>name.indexOf(0)?1:-1;
            result = stu.name.compareTo(name);
        }
        return result;
    }
}

class Teacher{
    int num;
    double salary;
    public Teacher(int num,double salary){
        this.num = num;
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "num=" + num +
                ", salary=" + salary +
                '}';
    }
}

class TeacherComparator implements Comparator{

    @Override
    public int compare(Object o1, Object o2) {
        Teacher t1 = (Teacher)o1;
        Teacher t2 = (Teacher)o2;
        int result = t1.num<t2.num?1:(t1.num==t2.num?0:-1);
        return result=result==0?(t1.salary<t2.salary?1:-1):result;
    }
}

輸出:

[Student{num=1, name='jj'}, Student{num=0, name='kj'}, Student{num=0, name='kk'}, Student{num=0, name='kw'}, Student{num=2, name='ll'}]
---------------
[Student{num=2, name='ll'}, Student{num=1, name='jj'}, Student{num=0, name='kw'}, Student{num=0, name='kk'}, Student{num=0, name='kj'}]
---------------
*****************
[Teacher{num=1, salary=12.0}, Teacher{num=0, salary=13.0}, Teacher{num=0, salary=14.0}, Teacher{num=2, salary=15.0}, Teacher{num=2, salary=16.0}]
[Teacher{num=2, salary=16.0}, Teacher{num=2, salary=15.0}, Teacher{num=1, salary=12.0}, Teacher{num=0, salary=14.0}, Teacher{num=0, salary=13.0}]
*****************


發佈了160 篇原創文章 · 獲贊 48 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章