Comparable和Comparator的区别
Comparable
Comparable 是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”,该接口只有一个方法compareTo
强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。
实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public class Person implements Comparable<Person>{
private String name; private int age; ...省略
@Override public int compareTo(Person o) { return o.getAge() - this.getAge(); } }
|
Comparator
Comparator 是比较器接口。我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们可以建立一个该类的比较器来进行排序。
可以将Comparator 传递给sort方法(如Collections.sort或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。
如果在使用的时候,想要独立的定义规则去使用可以采用**Collections.sort(Listlist,Comparetor c)**方式,自己定义规则:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ArrayList< Student> list02 = new ArrayList<>(); list02.add(new Student("a迪丽热巴",18)); list02.add(new Student("古力娜扎",20)); list02.add(new Student("杨幂",17)); list02.add(new Student("b杨幂",18)); System.out.println(list02);
Collections.sort(list02, new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { return o1.getAge()-o2.getAge(); } });
|
结果:[Student{name=’杨幂’, age=17}, Student{name=’a迪丽热巴’, age=18}, Student{name=’b杨幂’, age=18}, Student{name=’古力娜扎’, age=20}]
注意:使用排序相关方法时,必须保证排序的对象是可比较的,否则会抛出异常
基本类型数组的排序
由于Comparator<? super T>中泛型只能传入引用类型,对于基本类型的数组排序要采用特殊的方法
自然升序排序
1 2 3
| int[] nums = {4,5,3,1,4}; Arrays.sort(nums); System.out.println(Arrays.toString(nums));
|
降序排序
需要用到流
1 2 3
| int[] nums = {4,5,3,1,4}; nums = Arrays.stream(nums).boxed().sorted((a, b) -> b - a).mapToInt(Integer::intValue).toArray(); System.out.println(Arrays.toString(nums));
|
引用类型数组排序
比较器降序排序
1 2 3
| String[] s = { "sort", "string", "array" }; Arrays.sort(s, Comparator.reverseOrder()); System.out.println(Arrays.toString(s));
|
自定义比较器排序
1 2 3 4 5 6 7 8
| String[] s = { "sort", "string", "array" }; Arrays.sort(s, new Comparator<String>() { @Override public int compare(String o1, String o2) { return o2.compareTo(o1); } }); System.out.println(Arrays.toString(s));
|