****
Comparable是排序接口
若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。
此接口只有一个方法compare,比较此对象与指定对象的顺序,如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
public static class Student implements Comparable{
private String name;
private int grade;
public Student(String name, int grade) {
this.name = name;
this.grade = grade;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
@Override//重写 comparable的compareto()方法
public int compareTo(Object o) {
Student stu=(Student)o;
int t=this.grade-stu.grade;
return t==0?this.name.compareTo(stu.name):t;
}
//有排序功能的总结
1.数组排序Arrays.sort(对象数组) 2.TreeSet自然排序 3.Collections.sort(对象集合)
****
Comparator是比较接口,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现Comparator来新建一个比较器,然后通过这个比较器对类进行排序。
public class Homework {
public static void main(String[] args) {
TreeSet<Student> ts=new TreeSet(new CompareByGrade());
//如果是对象数组的话 Arrays.sort(对象数组名,new 比较器());
ts.add(new Student("sunyucui", 99));
ts.add(new Student("tom", 88));
ts.add(new Student("rose", 88));
ts.add(new Student("sunyucui", 60));
ts.add(new Student("jerry", 17));
Iterator<Student> it=ts.iterator();
while(it.hasNext()){
Student stu=(Student)it.next();
System.out.println(stu.name+": "+stu.grade);
}
}
public static class Student{
private String name;
private int grade;
public Student(String name, int grade) {
this.name = name;
this.grade = grade;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
}
// 新建一个“比较器”类
static class CompareByGrade implements Comparator{
public int compare(Object o1, Object o2) {
Student s1=(Student)o1;
Student s2=(Student)o2;
int t=s1.grade-s2.grade;
return t==0?s1.name.compareTo(s2.name):t;
//按照成绩排名,如果成绩一样就比较名字
}
}
}
*********
Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。
两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。