在前面使用Comparable接口来实现对象的比较时,我们不难发现,这个比较方法并不灵活,只能固定地通过一种方式去比较,那么如果我们有的时候想通过年龄比较,有的时候想通过姓名比较,这个接口就无法实现了,这时地解决办法就是,换一个接口,用Comparator接口来实现!
这时,我们分别写两个类——NameComparator和AgeComparator,代表分别通过姓名比较和通过年龄比较。并且这两个类都要实现Comparator接口!
import java.util.Comparator;
public class NameComparator implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
return o1.getName().compareTo(o2.getName());//姓名通过compareTo方法进行比较
}
}
import java.util.Comparator;
public class AgeComparator implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge() - o2.getAge();
}
}
注意: 实现Comparator接口需要重写的时compare方法,不是compareTo方法!实现Comparable接口重写的才是compareTo方法!
学生类如下:
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
测试一下代码:
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
//两个对象的比较
AgeComparator ageComparator = new AgeComparator();
NameComparator nameComparator = new NameComparator();
Student student1 = new Student("zhangsan", 20);
Student student2 = new Student("lisi", 30);
System.out.println("根据年龄比:" + ageComparator.compare(student1, student2));
System.out.println("根据姓名比:" + nameComparator.compare(student1, student2));
//一组对象的比较
Student[] students = new Student[]{
new Student("zhangsan", 10),
new Student("lisi", 18),
new Student("wangwu", 9)};
System.out.println("排序前:" + Arrays.toString(students));
Arrays.sort(students, ageComparator);
System.out.println("根据年龄排序后:" + Arrays.toString(students));
Arrays.sort(students, nameComparator);
System.out.println("根据姓名排序后:" + Arrays.toString(students));
}
}
分析两个对象的比较:
这里,我们创建了一个AgeComparator和一个NameComparator对象,用来表示是通过年龄比较还是通过姓名比较。注意最后两个Student类对象的比较方法
分析一组对象的比较:
我们发现,在用Arrays.sort排序时,里面还加上了一个ageComparator对象(或NameComparator对象),通过这个对象,可以控制通过什么方式去比较,当使用Arrays对数组进行排序时,就会调用ageComparator(或NameComparator)里的compare方法依次将数组里的对象进行比较
最后,运行结果: