首先从翻译上来说,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;
}
}