1. 程式人生 > >java內外部比較器(Comparator、Comparable)使用場景與詳解

java內外部比較器(Comparator、Comparable)使用場景與詳解

內外部比較器使用:

  • 內部比較器:需比較的類實現介面 Comparable,使該類對外提供一個預設比較的實現
public class Test {
    public static void main(String[] args) {
        //建立TreeSet並加入worker物件
        TreeSet<Worker> set = new TreeSet<Worker>();
        set.add(new Worker("zhang3", 18));
        set.add(new Worker("li4", 25));
        set.add(new
Worker("wang5", 22)); set.add(new Worker("lao6", 22)); set.add(new Worker("xiaoming", 22)); //遍歷輸出資訊 Iterator<Worker> iterator = set.iterator(); while (iterator.hasNext()) { Worker worker = iterator.next(); System.out.println(worker); } } } public
class Worker implements Comparable<Worker> { private String name; private int age; public Worker(String name, int age) { super(); this.name = name; this.age = age; } /* * 先按年齡排,次要按名字排 * 負整數、零或正整數,根據此物件是小於、等於還是大於指定物件。 */ @Override public
int compareTo(Worker w) { int sub = this.age - w.age; if (sub == 0) return this.name.compareTo(w.name);//使用String的comareTo方法 else return sub; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "Worker [name=" + name + ", age=" + age + "]"; } }
  • 外部比較器:需比較的類不做任何實現,該類通過工具類Collections呼叫sort方法傳入一個實現了介面 Comparator的類和一個List
public class Test {
    public static void main(String[] args) {
        //建立List並加入worker物件
        List<Worker> list = new ArrayList<Worker>();
        list.add(new Worker("zhang3", 18));
        list.add(new Worker("li4", 25));
        list.add(new Worker("wang5", 22));
        list.add(new Worker("lao6", 22));
        list.add(new Worker("xiaoming", 22));

        Collections.sort(list, new MyComparator());//傳入list和比較器排序

        //遍歷輸出資訊
        for (int i = 0; i < list.size(); i++) {
            Worker worker = list.get(i);
            System.out.println(worker);
        }
    }
}

public class Worker {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Worker [name=" + name + ", age=" + age + "]";
    }

}

public class MyComparator implements Comparator<Worker> {
    /*
     * 先按年齡排,次要按名字排
     * 根據第一個引數小於、等於或大於第二個引數分別返回負整數、零或正整數
     */
    @Override
    public int compare(Worker o1, Worker o2) {
        int sub = o1.getAge() - o2.getAge();
        if (sub == 0)
            return o1.getName().compareTo(o2.getName());//使用String的comareTo方法
        else
            return sub;
    }

}

總結:

  • TreeSet僅能根據建立時實現的comparable介面(內部比較器)進行排序,且HashSet不支援內部比較器,工具類Collections.sort()方法僅能對List排序。
  • TreeSet—使用— 內部比較器
  • List—使用—外部比較器
  • 在一個類沒有提供比較器時或提供的比較器不適用時,就需要使用外部比較器(例如:拿到一個jar包但它的類沒比較器,總不能反編譯去改程式碼)