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