通过源码发现Comparator
是一个接口。
根据compare
方法中的注释可以发现方法返回三种类型的值,正数、零、负数,分别对应 小于,等于,大于。
1:前面的数 > 后面的数,是降序(从大到小)的,如果想要改为升序排列,就需要返回 1;
-1:前面的数 < 后面的数,是升序(从小到大)的,不改变位置就返回 -1;
0:二者相等,不进行交换,也就不排序。但是要根据题目来判断返回什么。如果数组是无序的,不能直接返回0。
若保证升序排列,要返回o1 - o2,降序则 o2 - o1。( o1值的是集合中的第一个对象,o2是第二个对象)
return 0:不交换位置,不排序
return 1:交换位置
return -1:不交换位置
下面将对Comparator
接口的用法进行讲解:
使用Arrays
类中的sort
方法直接对ages
进行排序,默认排序方式为升序。
使用匿名内部类对数据这里要求数组不能为基本类型的素组,可以转化为基本数据类型对应的包装类进行降序排列:
return o1 - o2; -- 升序排列return o2 - o1; -- 降序排列
使用Arrays
类中的sort
方法,如下所示:
创建Student
学生实体类:
public class Student {private int age;private String name;private double height;// setXXX/getXXX,构造方法,toString方法
}
直接对Strudent
数据进行排序:可以发现对实体类数组直接进行排序会报错。
结合Comparator
对Strudent
数组按照年龄从低到高进行排序:
结合Comparator
对Strudent
数组按照身高从高到底进行排序:
使用场景:假如说我们有这样一个需求,需要设计一个Student
类,有两个属性:姓名(name
)、年龄(age
)和身高(height
),按照年龄的大小进行排序,那么就可以使用Comparable
进行实现,注意区别Comparator
Student
类并实现Comparable
接口, 按照年龄升序排列:Comparator
,其中泛型T
为比较器可以比较的对象的类型,在这里面为Person
Student
类并实现Comparable
接口, 按照年龄降序排列:Student
类并实现Comparable
接口, 按照身高升序排列:Student
类并实现Comparable
接口, 按照身高降序排列:Comparable 和 Comparator 的区别
java.lang.Comparable
:在类定义的时候,可以实现好的接口,里面有compareTo这个方法需要实现。java.util.Comparator
:是挽救的比较接口(假如我们需要对别人给Person类进行排序,但是Person类里面没有Comparable接口,如果在不允许改变源代码的情况下,我们就可以使用Comparator接口),需要单独定义一个比较类,里面有compare比较方法。
上一篇:nginx http模块
下一篇:【Linux】P3 用户与用户组