Comparable和Compator都是用于给集合排序的接口,但是他们之间的区别是什么呢。
compareTo。比如我们想通过年龄给用户排序,那么我们的用户要实现Comparable接口的方法,假如一旦要通过用户的评分进行排序,我们就必须要修改compareTo方法。// o 是要比较的对象
// 返回负数,小于要比较的对象
// 返回 0 ,等于要比较的对象
// 返回正数,大于要比较的对象
public interface Comparable<T> {
public int compareTo(T o);
}
public interface Comparator<T> {
// 返回负数,第一个小于第二个的对象,o1 < o2
// 返回 0 ,对象相等 o1 = o2
// 返回正数,第一个大于第二个对象 o1 > o2
int compare(T o1, T o2);
// 判断Compator之间是不是相同的
boolean equals(Object obj);
}
public class User implements Comparable<User>{
private Integer id;
private Integer rank;
private Integer age;
private String name;
//getter and setter
public User(Integer rank, Integer age, String name) {
this.rank = rank;
this.age = age;
this.name = name;
}
// 通过rank进行排序
@Override
public int compareTo(User o) {
return this.getRank() - o.getRank();
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + ''' +
", rank=" + rank +
", age=" + age +
'}';
}
}
public class User implements Comparable<User>{
private Integer id;
private Integer rank;
private Integer age;
private String name;
//getter and setter
public User(Integer rank, Integer age, String name) {
this.rank = rank;
this.age = age;
this.name = name;
}
// 通过rank进行排序
@Override
public int compareTo(User o) {
return this.getAge() - o.getAge();
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + ''' +
", rank=" + rank +
", age=" + age +
'}';
}
}
public class App {
public static void main(String[] args) {
List<User> list = new ArrayList<User>();
list.add(new User("aihe",100,23));
list.add(new User("weidong",80,25));
list.add(new User("zhangbo",85,28));
list.add(new User("leizhen",90,29));
Collections.sort(list);
System.out.println(list);
}
}
public class RankComparator implements Comparator<User> {
// 通过rank进行排序
public int compare(User o1, User o2) {
return o1.getRank() - o2.getRank();
}
}
public class AgeComparator implements Comparator<User> {
// 通过age进行排序
public int compare(User o1, User o2) {
return o1.getAge() - o2.getAge();
}
}
public class App {
public static void main(String[] args) {
List<User> list = new ArrayList<User>();
list.add(new User("aihe",100,23));
list.add(new User("weidong",80,25));
list.add(new User("zhangbo",85,28));
list.add(new User("leizhen",90,29));
Collections.sort(list,new RankComparator());
//Collections.sort(list,new AgeComparator());
System.out.println(list);
}
}
如果我们的排序方式一般不会变化,我们知道要排序什么字段,在创建对象的时候可以直接实现Comparable接口。
如果我们还不清楚要比较什么字段,那么可以等到后续确定的时候实现Comparator接口,Comparator接口是从外部进行排序,不会对对象产生影响。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1870/viewspace-2816009/ ,如需转载,请注明出处,否则将追究法律责任。