傻傻的分不清 Comparator 和 Comparable 接口? 两分钟弄懂~
目录
一、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;@Overridepublic int compareTo(Student student) {return this.age - student.age;}public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic 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;}@Overridepublic 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>() {@Overridepublic int compare(Student o1, Student o2) {return o1.age - o2.age;}});System.out.println(list);}
}
执行结果如下: