一、排序需求
当我们有一个学生类,我们属性有姓名,年龄,分数。我们想分别根据属性来将学生进行排序。
因为学生是引用类型,肯定不能这样比较:
if (student1 > student2){
System.out.println("student1 > student2");
}
于是,我们通过接口Comparator来实现
二、用法
需要将哪个类排序,就让哪个类实现接口Comparable<T>,T写类名
然后再重写接口的compareTo(类名 o)方法
1、以按年龄排序为例:
import java.util.Arrays;
class Student implements Comparable<Student>{ //实现了Comparable接口
String name;
int age;
double score;
public Student(String name, int age, double score) {
this.name = name;
this.age = age;
this.score = score;
}
@Override //重写了Comparable接口中的compareTo方法
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 TestDemo {
public static void main(String[] args) {
Student[] students = new Student[3];
students[0] = new Student("小明",18,98.3);
students[1] = new Student("小红",17,92.1);
students[2] = new Student("小华",19,88.3);
Arrays.sort(students); //实现排序
System.out.println(Arrays.toString(students));
}
}
也可以这样重写
@Override //重写了Comparable接口中的compareTo方法
public int compareTo(Student o) {
return this.age - o.age ; //从小到大排序
}
2、根据分数排序
在重写方法时,因为返回值是int类型的,而分数是double类型的,需要强制转换
@Override //重写了Comparable接口中的compareTo方法
public int compareTo(Student o) {
return (int)(this.score - o.score) ; //因为返回值是int类型的,而分数是double类型的,需要强制转换
}
3、根据姓名首字母排序
因为字母不能相减,因此需要用到String中自带的compareTo方法
@Override //重写了Comparable接口中的compareTo方法
public int compareTo(Student o) {
return this.name.compareTo(o.name);
}
三、比较器
因为一个类,实现了了Comparable接口,只能有一个重写的方法,对类的侵入性太强。
可以通过比较器来实现通过不同的属性进行排序
1、语法
写一个比较器类,实现Comparator比较器接口,重写方法
年龄比较器:
class AgeComparator implements Comparator<Student>{ //年龄比较器
@Override
public int compare(Student o1, Student o2) { //重写方法
return o1.age - o2.age;
}
}
分数比较器:
class ScoreComparator implements Comparator<Student>{ //分数比较器
@Override
public int compare(Student o1, Student o2) {
return (int)(o1.score - o2.score);
}
}
姓名首字母比较器:
class NameComparator implements Comparator<Student>{ //姓名首字母比较器
@Override
public int compare(Student o1, Student o2) {
return o1.name.compareTo(o2.name);
}
2、用法:实例化比较器类
public class TestDemo {
public static void main(String[] args) {
Student[] students = new Student[3];
students[0] = new Student("mo",18,98.3);
students[1] = new Student("ll",17,92.1);
students[2] = new Student("nn",19,88.3);
AgeComparator ageComparator = new AgeComparator();
Arrays.sort(students,ageComparator);
}
}