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}]
*****************