Comparable 是排序接口;若一个类实现了 Comparable 接口,就意味着 “该类支持排序”。而 Comparator 是比较器;我们若需要控制某个类的次序,可以建立一个 “该类的比较器” 来进行排序。
1.若一个类实现了Comparable 接口,实现 Comparable 接口的类的对象的 List 列表 ( 或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。
public class Person1 implements Comparable<Person1> { private int age; private String name; public Person1(String name, int age) { this.name = name; this.age = age; } @Override public int compareTo(Person1 o) { // return this.age-o.age; //升序 return o.age-this.age; //降序 } @Override public String toString() { return name+":"+age; } }
public class Test { public static void main(String[] args) { Person1 person1 = new Person1("zzh",18); Person1 person2 = new Person1("jj",17); Person1 person3 = new Person1("qq",19); List<Person1> list = new ArrayList<>(); list.add(person1); list.add(person2); list.add(person3); Collections.sort(list); System.out.println(list); Person1[] a={person1,person2,person3}; Arrays.sort(a); System.out.println(a[0]); } }
2.对类自身无法修改这就用到了Comparator这个接口(策略模式)。
public final class Person2 { private int age; private String name; public Person2(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return name+":"+age; } //getter and setter方法省略.... }
public class Test { public static void main(String[] args) { Person2 p1 = new Person2("zzh", 18); Person2 p2 = new Person2("jj", 17); Person2 p3 = new Person2("qq", 19); List<Person2> list2 = new ArrayList<Person2>(); list2.add(p1); list2.add(p2); list2.add(p3); Collections.sort(list2, new Comparator<Person2>() { @Override public int compare(Person2 o1, Person2 o2) { if (o1 == null || o2 == null) return 0; return o1.getAge() - o2.getAge(); } }); System.out.println(list2); } }