1.使用Comparator需要import java.util.Comparator,而Comparable不需要import任何东西;
2.使用Comparator必须单独给他造一个类,实现一个形如public int compare(Object o1,Object o2){}的函数,
使用Comparable需要在用到比较器的类中实现该接口,即实现一个形如public int compareTo(Object o){}的函数,可以很明显的看出Comparator是从外面传进来两个参互相比,Comparable是从外面传进来一个参和自己比;
3.使用Comparator需要在排序的类里Arrays.sort(List,new YourComparator())(这里的List指的是要排序的数组,YourComparator泛指自己定义的比较器),甚至可以直接在new的时候实现,这样就不用另造一个类了,例如:
Arrays.sort(list, new Comparator<Object>(){
@Override
public int compare(Object o1, Object o2) {
//内容
}
});
使用Comparable需要在排序的类里Arrays.sort(List)一下,例如:
import java.util.Scanner;
import java.util.Arrays;
//import java.util.Comparator;
class Stu implements Comparable<Stu> {
int a;
int b;
int c;
Stu(int a,int b,int c){
this.a=a;
this.b=b;
this.c=c;
}
@Override
public int compareTo(Stu o) {
// TODO Auto-generated method stub
return this.a>o.a?1:(this.a==o.a?0:-1);//三个数但只以a为标准
}
}
public class Main{
public static void main(String args[]) {
Stu[] m=new Stu[3];
m[0]=new Stu(4,2,3);
m[1]=new Stu(2,3,1);
m[2]=new Stu(1,5,1);
Arrays.sort(m);
for(int i=0;i<3;i++) {
System.out.println(m[i].a+" "+m[i].b+" "+m[i].c+"\n");
}
}
}
//前面两段可以直接合成一段:
/*
public class Main implements Comparable<Main> {
int a;
int b;
int c;
Main(int a,int b,int c){
this.a=a;
this.b=b;
this.c=c;
}
@Override
public int compareTo(Main o) {
// TODO Auto-generated method stub
return this.a>o.a?1:(this.a==o.a?0:-1);//三个数但只以a为标准
}
public static void main(String args[]) {
Main[] m=new Main[3];
m[0]=new Main(4,2,3);
m[1]=new Main(2,3,1);
m[2]=new Main(1,5,1);
Arrays.sort(m);
for(int i=0;i<3;i++) {
System.out.println(m[i].a+" "+m[i].b+" "+m[i].c+"\n");
}
}
}
*/
4.用法上的不同我大概就总结出来以上几点,选择的时候个人觉得用Comparator比较好,因为Comparable能做的他都能做,Comparable不能做的(比如用不同的方式对同一个类进行排序)他也能做(多定义几种不同的YourComparator呗),除了可能麻烦点要单独构造类,但是函数不还比Comparable少写俩字母(To)么,而且从程序设计的角度来看,Comparator降低了比较器和类的耦合度,不至于说我比较器错了或者要更新改进就要去类那里改。
ps:以上均为个人理解,欢迎指正。