目录
一、Comparable 接口
二、Comparator 接口
一、Comparable 接口
Comparable 是一个排序接口(意味着该支持排序),可以看作内比较器,也就是说可以和自己比较,通常用来自己属性与自己属性进行比较,最后通过 Collections.sort 得出该类在这个 “排序规则” 下得出的顺序,依赖于 compareTo 方法进行比较,该方法只有一个参数,就是要比较的对象。
怎么使用呢?例如我们有一个 Student 类,需要按照年龄进行升序排序,那么就可以让该类实现 comparable 接口,重写 compareTo 方法,比较规则为按照年龄大小升序进行排序,如下代码:
Ps:这里升序还是降序,到底是用谁减谁?不用死记,每次用之前自己试一下,试多了自然清楚.
import java.util.*;
class Student implements Comparable<Student> {
private String name;
private int age;
@Override
public int compareTo(Student student) {
return this.age - student.age;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Solution {
public static void main(String[] args) {
Student s1 = new Student("u1", 15);
Student s2 = new Student("u2", 19);
Student s3 = new Student("u3", 11);
List<Student> list = new ArrayList<>();
list.add(s1);
list.add(s2);
list.add(s3);
Collections.sort(list);
System.out.println(list);
}
}
执行结果如下:
二、Comparator 接口
comparator 相当于一个通用的比较工具类接口,也就是说不在像 Comparable 接口那样给某个类实现一个比较器,而是需要我们为这个接口定制一个比较类去实现比较规则,通过重写 compare 方法,方法的参数就是两个进行比较的对象(对象不用做任何改变,实现解耦)。
怎么使用呢?例如有一个 Student 类,需要按照年龄进行升序排序,那么我们就可以去定制一个比较类,重写比较规则,代码如下:
import java.util.*;
class Student {
public String name;
public int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Solution {
public static void main(String[] args) {
Student s1 = new Student("u1", 15);
Student s2 = new Student("u2", 19);
Student s3 = new Student("u3", 11);
List<Student> list = new ArrayList<>();
list.add(s1);
list.add(s2);
list.add(s3);
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.age - o2.age;
}
});
System.out.println(list);
}
}
执行结果如下: