Comparable与Comparator (1)


1. Comparator和Comparable的异同

相同点

  • 两者都是接口类型,使用时均需要重写相应的方法。

不同点

  • Comparable可以理解为“类有排序功能”,其接口中只有public int compareTo(T o)一个方法。
  • Comparator是比较器,可以自由控制某个类的次序,其接口在jdk 1.8之前只有int compare(T o1, T o2)boolean equals(Object obj)这两种方法,1.8之后又增加了很多方法。

2. 代码测试

import java.util.*;

public class test {
    public static void main(String[] args) {
        List list1 = new ArrayList<>();
        list1.add(new Student("apple", 19));
        list1.add(new Student("appla", 19));
        list1.add(new Student("orange", 13));
        list1.add(new Student("peach", 14));
        list1.add(new Student("banana", 16));
        Collections.sort(list1);
        System.out.println("---------按name首字母顺序输出-------------");
        for (Student s : list1) {
            System.out.println(s);
        }

        System.out.println("---------按name长短输出-------------");
        List list2 = new ArrayList<>();
        list2.add(new Student("ab", 13));
        list2.add(new Student("abc", 14));
        list2.add(new Student("abcd", 15));
        list2.add(new Student("ba", 18));
        // 添加重写后的 Comparator
        Collections.sort(list2, new myComparator());
        for (Student s : list2) {
            System.out.println(s);
        }
    }
}

/**
 * 使用 Comparable接口
 * 按 name的字母排序输出
 */
class Student implements Comparable {
    String name;
    int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Student s) {
        return this.name.compareTo(s.name);
    }

    @Override
    public String toString() {
        return this.name + "-" + this.age + "";
    }
}

/**
 * 使用 Comparator接口
 * 按 name的长短输出
 */
class myComparator implements Comparator {
    @Override
    public int compare(Student o1, Student o2) {
        int num1 = o1.name.length() - o2.name.length();
        // name长度一样,则按照字母排序
        int num2 = o1.name.compareTo(o2.name);
        return num1 == 0 ? num2 : num1;
    }
}

3. 测试结果