首先從翻譯上來說,Comparable是可比較的,修飾的是對象,所以當一個對象實現這個接口的時候,這個對象就變成可比較的對象了,需要實現的方法爲compareTo(T o)。Comparator是比較器,是一個名詞,當我們比較兩個對象的時候,標準是什麼呢?可以通過這個比較器Comparator來定義,需要實現的接口是compare(T o1, T o2),還有一個equals(Object obj)。
那麼,究竟怎麼比較和排序呢?
可以這樣理解,對於一個集合中的元素,比如學生對象集合,我們排序一般用學號,所以學生對象實現Comparable接口,並按學號比較即可;可是事情總會有特殊情況,在某一處,我們需要按學生姓名排序,怎麼辦呢,那就再寫一個比較器即可。
下面是個例子:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Example {
public static void main(String[] args) {
// String本來就是實現了Comparable接口
List<String> list = new ArrayList<String>();
list.add("1");
list.add("3");
list.add("2");
// 本來插入的順序
System.out.println(list);
// 按照Comparable排序
Collections.sort(list);
System.out.println(list);
// 按照自定義的Comparator排序
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s2.compareTo(s1);
}
});
System.out.println(list);
System.out.println("---------------------");
System.out.println("---------------------");
List<Student> students = new ArrayList<Student>();
students.add(new Student(1, "John"));
students.add(new Student(3, "Smith"));
students.add(new Student(2, "Lucy"));
System.out.println(students);
Collections.sort(students);
System.out.println(students);
Collections.sort(students, new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
return s2.getNo() - s1.getNo();
}
});
System.out.println(students);
}
}
class Student implements Comparable<Student> {
private int no;
private String name;
public Student(int no, String name) {
this.no = no;
this.name = name;
}
@Override
public String toString() {
return no + ":" + name;
}
@Override
public int compareTo(Student s) {
return this.no - s.no;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}