Comparable 和 Comparator 都是用来实现集合中元素的比较、排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。
Comparator位于包java.util下,而Comparable位于包 java.lang下。
Comparable 接口
JDK的大量的类包括常见的 String、Byte、Char、Date等都实现了Comparable接口。
实现方法:需要排序的类实现Comparable接口,并重写接口的compareTo方法;
实例:按照User的年龄进行倒序排列
public class User implements Comparable<User>{
private String name;
private int age;
public int getAge() {
return age;
}
@Override
public int compareTo(User o) {
if(o!=null){
if(this.getAge()>o.getAge()){
return -1;
}else if(this.getAge()==o.getAge()){
return 0;
}
}
return 1;
}
}
compareTo方法的返回值是int,有三种情况:
1、比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数
2、比较者等于被比较者,那么返回0
3、比较者小于被比较者,那么返回负整数
public static void main(String[] args){
List<User> userList = new ArrayList<>();
userList.add(new User("Tom",2));
userList.add(new User("jack",23));
userList.add(new User("Shushan",1));
userList.add(new User("Idhua",21));
Collections.sort(userList);
System.out.println(userList);
}
Comparator 接口
实现方法:新建一个类,实现Comparator接口,并重写compare方法;
实例:使用匿名内部类或者新建一个类实现都行
public class Person {
private String name;
private int number;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
public static void main(String[] args){
List<Person> list = new ArrayList<Person>();
list.add(new Person("Kobi", 1));
list.add(new Person("Cury", 3));
list.add(new Person("ZhanMushi", 2));
list.add(new Person("Dulante", 4));
list.add(new Person("Jordan", 0));
//匿名内部类版本(根据number进行排正序)
Collections.sort(list, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
if(o1.getNumber() < o2.getNumber()){
return -1;
}else if(o1.getNumber() == o2.getNumber()){
return 0;
}
return 1;
}
});
}
compare方法有两个参数T o1和T o2,是泛型的表示方式,分别表示待比较的两个对象,方法返回值和Comparable接口一样是int,有三种情况:
1、o1大于o2,返回正整数
2、o1等于o2,返回0
3、o1小于o3,返回负整数