Comparable和Comparator

  • Comparable 接口实际上是出自java.lang包,他有一个compareTp(Object obj )方法用来排序
  • comparator 接口实际上是出自java.util 包,他有一个compare(object obj1,object obj2)方法用来排序

一般我们需要对一个集合使用自定义排序时,我们就要重写compareTo() 方法或者compare() 方法,

  • 当我们需要对某一个集合实现两种排序,比如一个song对象中的歌名和歌手名分别采用一种排序方式的话,我们可以重写compareTo()方法和使用自制的Comparator方法或者两个Comparator来实现歌名排序和歌名排序,
  • 第二种代表我们只能使用两个参数版的Collections.sort()

    1. Comparator 定制排序

    ArrayList arrayList = new ArrayList();
    arrayList.add(-1);
    arrayList.add(3);
    arrayList.add(3);
    arrayList.add(-5);
    arrayList.add(7);
    arrayList.add(4);
    arrayList.add(-9);
    arrayList.add(-7);
    System.out.println(“原始数组:”);
    System.out.println(arrayList);
    // void reverse(List list):反转
    Collections.reverse(arrayList);
    System.out.println(“Collections.reverse(arrayList):”);
    System.out.println(arrayList);
    // void sort(List list),按自然排序的升序排序
    Collections.sort(arrayList);
    System.out.println(“Collections.sort(arrayList):”);
    System.out.println(arrayList);
    // 定制排序的用法
    Collections.sort(arrayList, new Comparator() {
    @Override
    public int compare(Integer o1, Integer o2) {
    return o2.compareTo(o1);
    }
    });
    System.out.println(“定制排序后:”);
    System.out.println(arrayList);
    输出:
    原始数组:
    [-1, 3, 3, -5, 7, 4, -9, -7]
    Collections.reverse(arrayList):
    [-7, -9, 4, 7, -5, 3, 3, -1]
    Collections.sort(arrayList):
    [-9, -7, -5, -1, 3, 3, 4, 7]
    定制排序后:
    [7, 4, 3, 3, -1, -5, -7, -9]

    2. Comparable 定制排序

    重写compareTo 方法实现按年龄来排序
    public class Person implements Comparable {
    private String name;
    private int age;
    public Person(String name, int age) {
    super();
    this.name = name;
    this.age = age;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public int getAge() {
    return age;
    }
    public void setAge(int age) {
    this.age = age;
    }
    /*
    TODO重写compareTo方法实现按年龄来排序
    */
    @Override
    public int compareTo(Person o) {
    // TODO Auto-generated method stub
    if (this.age > o.getAge()) {
    return 1;
    } else if (this.age < o.getAge()) {
    return -1;
    }
    return age;
    }
    }
    public static void main(String[] args) {
    TreeMap pdata = new TreeMap();
    pdata.put(new Person(“张三”, 30), “zhangsan”);
    pdata.put(new Person(“李四”, 20), “lisi”);
    pdata.put(new Person(“王五”, 10), “wangwu”);
    pdata.put(new Person(“小红”, 5), “xiaohong”);
    // 得到key的值的同时得到key所对应的值
    Set keys = pdata.keySet();
    for (Person key : keys) {
    System.out.println(key.getAge() + “-“ + key.getName());
    }
    }
    输出:
    5-小红
    10-王五
    20-李四
    30-张三