Comparable比較器
Comparable 位於java.lang 套件下,本質上是一個內比較器,實作了Comparable 的類別可以自己比較,至於比較的結果如何則需要依賴自然比較方法compareTo 的實作。
compareTo 的回傳值有 -1、0、1。若比較者大於被比較者,那麼回傳1,等於則回傳0,小於返回-1。
Collections.sort
和 Arrays.sort
可以自動對實作 Comparable 的物件進行排序。
免費線上學習影片推薦:java學習
範例如下,我們建立一個 node 對象,並透過 node 物件之間的比較驗證 Comparable 的用法。
node 物件的實作如下:
public class Node implements Comparable<Object>{ private int num; private String name; @Override public String toString() { return "num=" + num + " name=" + name; } public Node(int num, String name) { super(); this.num = num; this.name = name; } public Node() { super(); } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int compareTo(Object o) { Node node = (Node)o; return this.num - node.getNum(); } }
可以看到,我們為 Node 實作了 Comparable 接口,並且重寫了 compareTo 方法。
先測試一下,我們建立10個 Node 物件並加入到 List 中,然後把順序打亂。
public class MyTest { public static void main(String[] args) { List<Node> list = new ArrayList<Node>(); for(int i = 0;i < 10;i++) { list.add(new Node(i,"node")); } //打乱顺序 Collections.shuffle(list); for (Node node : list) { System.out.println(node); } } }
顯示結果如下:
num=7 name=node num=0 name=node num=5 name=node num=9 name=node num=6 name=node num=3 name=node num=4 name=node num=8 name=node num=1 name=node num=2 name=node
現在輸出是亂序的,接下來我們使用 Collections.sort 對其進行排序。
public class MyTest { public static void main(String[] args) { List<Node> list = new ArrayList<Node>(); for(int i = 0;i < 10;i++) { list.add(new Node(i,"node")); } //打乱顺序 Collections.shuffle(list); Collections.sort(list); for (Node node : list) { System.out.println(node); } } }
Collections.sort 其實是按compareTo 方法中的定義進行比較,我們之前定義了按照num 的升序進行排序,現在排序結果如下:
num=0 name=node num=1 name=node num=2 name=node num=3 name=node num=4 name=node num=5 name=node num=6 name=node num=7 name=node num=8 name=node num=9 name=node
Comparator比較器
Comparator
位於java.util
套件下,本質上是一個外比較器。若一個類別內部未實作 Comparable 又或實作了 Comparable 但該比較方式不是自己想要的,我們可以考慮實作 Comparator。 Comparator 介面裡有一個 compare 方法,使用方法與 Comparable 中的 compareTo 相同。
我們需要將 Comparator 傳遞給排序方法,以便對排序順序進行控制。我們可以查看幾個排序方法的使用方法,發現可以傳入一個 Comparator 參數。
Collections.sort(List<T> list, Comparator<? super T> c); Arrays.sort(T[] a, Comparator<? super T> c);
修改我們先前的 Node 對象,不再實作 Comparable 。
public class Node{ private int num; private String name; @Override public String toString() { return "num=" + num + " name=" + name; } public Node(int num, String name) { super(); this.num = num; this.name = name; } public Node() { super(); } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
我們嘗試透過傳入一個 Comparator 來實現降序排序。
public class MyTest { public static void main(String[] args) { List<Node> list = new ArrayList<Node>(); for(int i = 0;i < 10;i++) { list.add(new Node(i,"node")); } //打乱顺序 Collections.shuffle(list); Collections.sort(list, new Comparator<Node>() { @Override public int compare(Node o1, Node o2) { return o2.getNum()-o1.getNum(); } }); for (Node node : list) { System.out.println(node); } } }
結果如下:
num=9 name=node num=8 name=node num=7 name=node num=6 name=node num=5 name=node num=4 name=node num=3 name=node num=2 name=node num=1 name=node num=0 name=node
Comparator 實作了逆序比較。
總結
Comparable 是內比較器,Comparator 是外比較器,如果類別沒有實作 Comparable 介面但是需要對其進行排序,我們可以考慮使用 Comparator 。從另一個角度來看,使用 Comparable 介面的耦合性大於 Comparator ,因為當我們需要對比較演算法進行修改的時候還需要修改 Comparable 的實作類別。
本文來自java快速入門欄目,歡迎大家一起來討論學習!
以上是java中的比較器comparable和Comparator的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!