Comparable 和 Comparator 的介绍
Comparable是 排序接口 ,只有一个方法 compareTo ,如果 想让一个类可以通过Arrays.sort() 方法进行排序,则可以让这个类继承Comparable接口 重写这个方法。
Comparator 是 比较接口 ,如果一个类本身不支持排序(即没有实现Comparable接口),但你又不能改动这个类,就可以写一个类(这个类又叫“比较器”) 实现Comparator接口, 然后重写Compare方法。我们想要排序的时候,就可以把这类的实例化对象传入到Arrays.sort() 这个方法里。
什么时候使用??
Comparable :当我们自己写一个类的时候 ,可以用这个方法 实现自己想要的比较规则
Comparator :当一个类 没有比较器 ,或者我们原本的比较器中的规则 不是我们想要的
Arrays.sort 重载的四类方法
sort( T[] a ) 对指定T型数组按数字升序排序。
sort( T[] a , int formIndex , int toIndex ) 对指定T型数组的指定范围按数字升序排序。
sort( T[] a , Comparator<? supre T> c ) 根据指定比较器产生的顺序对指定对象数组进行排序。
sort( T[] a , int formIndex , int toIndex , Comparator<? supre T> c) 根据指定比较器产生的顺序对指定对象数组的指定对象数组进行排序。
Comarable 与 sort 代码案例
class Student implements Comparable<Student>{ String name; int age; public Student(String name, int age) { this.name = name; this.age = age; } @Override public int compareTo(Student o) { return this.age - o.age; } } public class TestComparable{ public static void main(String[] args) { Student[] arr = new Student[]{new Student("aa",11), new Student("bb",22),new Student("cc",15)}; Arrays.sort(arr); for (Student student : arr) {//打印出排序的结果 System.out.println("name:" + student.name + " age:" + student.age); } //控制台打印结果: 我们可以看到 按照我们重写的CompareTo的规则(年龄)进行排序了 //name:aa age:11 //name:cc age:15 //name:bb age:22 } }
Comparator 与 sort 代码案例
//我们写一个实现Comparator的类,然后重写compare方法 class MyComparator implements Comparator<Integer> { @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } } public class TestComparator { public static void main(String[] args) { Integer[] arr = {2, 3, 44, 11, 344, 11}; MyComparator cmp = new MyComparator(); Arrays.sort(arr, cmp);//arr是数组,cmp是传入这个类 System.out.println(Arrays.toString(arr)); } //控制台打印结果: //[344, 44, 11, 11, 3, 2] }
而在真正写代码的时候 我们一般 通过匿名内部类的方法 去写一个比较器比如下面
public class TestComparator { public static void main(String[] args) { Integer[] arr = {2,3,44,11,344,11}; Arrays.sort(arr, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2-o1; } }); System.out.println(Arrays.toString(arr)); } //控制台打印结果: //[344, 44, 11, 11, 3, 2] }