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,返回负整数