1.前言
Comparable 简介
Comparable 是排序接口。
若一个类实现了Comparable接口,就意味着“该类支持排序”。
即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过
Collections.sort(或 Arrays.sort)进行排序。此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。
Comparator 简介
Comparator 是比较器接口。
我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。
也就是说,我们可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。
Comparator 和 Comparable 比较
Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。
而Comparator是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。我们不难发现:Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。
compareTo 方法
compareTo() 方法用于将 Number 对象与方法的参数进行比较。可用于比较 Byte, Long, Integer等。 语法
public int compareTo( NumberSubClass referenceName ) 参数 referenceName
– 可以是一个 Byte, Double, Integer, Float, Long 或 Short 类型的参数。返回值 如果指定的数与参数相等返回0。
如果指定的数小于参数返回 -1。
如果指定的数大于参数返回 1。
2.使用Comparable进行排序操作
注:此方法 实现 Comparable 接口,并重写 compareTo 方法进行比较。后台则以:Collections.sort(cList); 进行调用
public class User implements Comparable<User>{
private Integer id;
private String userName;
// 省略 setter/getter方法
/**
* 根据 ID 进行排序
* 0 表示两个对象相等
* 1 前面小后面大升序
* -1 后面的对象大于前面的对象 降序
*/
@Override
public int compareTo(User user) {
int result = 0;
if(user != null){
if(null == this.id && null == user.id){
result = 0;
}else if (null != this.id && null == user.id){
result = 1;
}else if (null == this.id && null != user.id){
result = -1;
}else {
result = this.id.compareTo(user.id);
}
}
return result;
}
}
后台调用,造数据进行比较
@Test
public void sortUser(){
List<User> cList = new ArrayList<>();
User user2 = new User();
User user3 = new User();
User user4 = new User();
User user5 = new User();
User user0 = new User();
user2.setId(2);
user3.setId(3);
user4.setId(4);
user5.setId(5);
user0.setId(0);
cList.add(user2);
cList.add(user3);
cList.add(user4);
cList.add(user5);
cList.add(user0);
Collections.sort(cList);
for (User u : cList){
System.out.println(u.getId());
}
//输出结果: 0 2 3 4 5
}
3.使用 Comparator 比较器进行排序
此方式有两种方式:
1.需要新建一个排序类 实现 Comparator 接口,并重写 compare 方法。后台则以:Collections.sort(cList,new 排序类()); 进行调用
2.直接在 Collections.sort(cList,new Comparator(new Comparator() {
@Override
public int compare(User user, User user2) {
return 0; /
}
第一种:创建排序类,实现Comparator 接口,针对 User 类 降序
public class UserCompar implements Comparator<User> {
@Override
public int compare(User user, User user2) {
int num = user.getId();
int num2 = user2.getId();
return -(num - num2); //降序排列
}
}
// 实现:
Collections.sort(cList,new UserCompar());
for (User u : cList){
System.out.println(u.getId());
}
输出结果:5 4 3 2 0
第二种:直接 new Comparator() 进行对比
Collections.sort(cList, new Comparator<User>() {
@Override
public int compare(User user, User user2) {
int num = user.getId();
int num2 = user2.getId();
return -(num - num2); //降序排列
}
});
for (User u : cList){
System.out.println(u.getId());
}
输出结果:5 4 3 2 0
很显然:第一种和第二种得出的结果是一样的。