介绍
Comparable和Comparator都是java的接口,Comparable在java.lang包下,而Comparator在java.util包下,两者功能都是排序。
1.Comparable
Comparable可以认为是一种内部比较器,我们在类定义时实现Comparable接口,并重写其compareTo方法,其返回类型为int
代码测试如下:
class Student implements Comparable<Student>{
public int age;
public String name;
public double score;
public Student(int age, String name, double score) {
this.age = age;
this.name = name;
this.score = score;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
", score=" + score +
'}';
}
@Override
public int compareTo(Student o) {
if(this.age>o.age){
return 1;
}else if(this.age == o.age){
return 0;
}else{
return -1;
}
}
}
public class Test {
public static void main(String[] args) {
Student[] students = new Student[3];
students[0] = new Student(18,"ahuang",88.3);
students[1] = new Student(19,"dabai",87.3);
students[2] = new Student(17,"zizi",89.3);
Arrays.sort(students);
System.out.println(Arrays.toString(students));
}
}
//输出结果
//[Student{age=17, name='zizi', score=89.3}, Student{age=18, name='ahuang', score=88.3}, Student{age=19, name='dabai', score=87.3}]
2.Comparator
Comparator是专门定义一个类比较器是实现的接口,需要重写其compare方法,其返回值为int、
代码测试如下:
class AgeComparator implements Comparator<Student>{
@Override
public int compare(Student o1,Student o2){
return o1.age- o2.age;
}
}
class StringComparator implements Comparator<Student>{
@Override
public int compare(Student o1,Student o2){
return o1.name.compareTo(o2.name);
}
}
class ScoreComparator implements Comparator<Student>{
@Override
public int compare(Student o1,Student o2){
return (int)(o1.score- o2.score);
}
}
public class Test2 {
public static void main(String[] args) {
Student[] students = new Student[3];
students[0] = new Student(18,"ahuang",88.3);
students[1] = new Student(19,"dabai",87.3);
students[2] = new Student(17,"zizi",89.3);
AgeComparator ageComparator = new AgeComparator();
Arrays.sort(students,ageComparator);
System.out.println(Arrays.toString(students));
StringComparator stringComparator = new StringComparator();
Arrays.sort(students,stringComparator);
System.out.println(Arrays.toString(students));
}
}
//输出结果
//[Student{age=17, name='zizi', score=89.3}, Student{age=18, name='ahuang', score=88.3}, Student{age=19, name='dabai', score=87.3}]
//[Student{age=18, name='ahuang', score=88.3}, Student{age=19, name='dabai', score=87.3}, Student{age=17, name='zizi', score=89.3}]
总结
1.Comparable在java.lang包下,Comparator在java.util包下
2.实现Comparable接口要重写comparTo方法,实现Comparator接口要重写compar方法
3.Comparable要修改原来的类实体,所以Comparator用得更多一些