比较器

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 0;//认为元素都是相同的
//自定义比较的规则,比较两个人的年龄(this,参数Person)
//return this.getAge() - o.getAge();//年龄降序排序
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, 3, 4, 4, 5]

降序排序

需要用到流

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)); //[5, 4, 4, 3, 1]

引用类型数组排序

比较器降序排序

1
2
3
String[] s = { "sort", "string", "array" };
Arrays.sort(s, Comparator.reverseOrder()); // 或者,使用 Collections.reverseOrder()`
System.out.println(Arrays.toString(s)); // [string, sort, array]

自定义比较器排序

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)); // [string, sort, array]

比较器
http://example.com/2023/05/13/Java/Java集合/8. 比较器/
作者
PALE13
发布于
2023年5月13日
许可协议