Comparator
在实际比较中,我们经常会使用到sort,我们发现源码存在这么一种重载
public static <T> void sort(T[] a, Comparator<? super T> c) {
if (c == null) {
sort(a);
} else {
if (LegacyMergeSort.userRequested)
legacyMergeSort(a, c);
else
TimSort.sort(a, 0, a.length, c, null, 0, 0);
}
}
后面这个参数就是要调用Comparator比较器,(可以理解他只是一个比较器)。让我们看一下它的源码
int compare(T o1, T o2);
发现有这么一个接口函数,关键就是这里,使用Comparator类的步骤就是定义一个比较器然后实现Comparator接口,关键就是要重写compare()方法。例如:
Comparator comparator = new Comparator(){
public int compare(Object o1,Object o2){
int[] arr= (int[]) o1;
int[] arr1 = ((int[]) o2);
if(arr[0]!=arr1[0]){
return arr1[0]-arr[0];
}
if(arr[1]!=arr1[1]){
return arr1[1]-arr[1];
}
if(arr[2]!=arr1[2]){
return arr1[2]-arr[2];
}
return 0;
}
};
然后如此调用
Arrays.sort(arr,comparator);
便可以做到排序的目的。
关于return 当return的是正数,代表前者大于后者,0代表两者相同,负数代表前者小于后者。
然后根据我的理解就是根据这些正负值sort去完成排序,至于sort是如何进行的,我以后再学习。
Comparable
这种方式,需要修改实体类,实现Comparable接口,然后重写compareTo方法。例如:
public class User implements Comparable<User>{
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(int age, String name) {
this.age = age;
this.name = name;
}
public User() {
}
@Override
public int compareTo(User o) {
return this.getAge() - o.getAge();
}
}
调用如此调用:
Collections.sort(userList);
总结
- 它们出自不同的包,Comparator在 java.util 包下,Comparable在 java.lang 包下。
- Comparator 使用比较灵活,不需要修改实体类源码,但是需要实现一个比较器。
- Comparable 使用简单,但是对代码有侵入性,需要修改实体类源码。