您好,登錄后才能下訂單哦!
java中的comparable與Comparator有區(qū)別嗎?針對這個問題,這篇文章給出了相對應(yīng)的分析和解答,希望能幫助更多想解決這個問題的朋友找到更加簡單易行的辦法。
在Java代碼中,我們常常會面臨需要對集合進行排序的情況,這種情況下我們需要手動的定義Java比較器,告訴程序兩個對象如何比較大小。Comparable和Comparator接口都是為了對類進行比較,眾所周知,諸如Integer,double等基本數(shù)據(jù)類型,java可以對他們進行比較,而對于類的比較,需要人工定義比較用到的字段比較邏輯??梢园袰omparable理解為內(nèi)部比較器,而Comparator是外部比較器。
Comparator比較器
Comparator
位于 java.util
包下,本質(zhì)上是一個外比較器。若一個類內(nèi)部未實現(xiàn) Comparable 又或者實現(xiàn)了 Comparable 但該比較方式不是自己想要的,我們可以考慮實現(xiàn) Comparator。Comparator 接口里有一個 compare 方法,使用方法與 Comparable 中的 compareTo 相同。
我們需要將 Comparator 傳遞給排序方法,以便對排序順序進行控制。我們可以查看幾個排序方法的使用方法,發(fā)現(xiàn)其可以傳入一個 Comparator 參數(shù)。
Collections.sort(List<T> list, Comparator<? super T> c); Arrays.sort(T[] a, Comparator<? super T> c);
修改我們之前的 Node 對象,不再實現(xiàn) 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 來實現(xiàn)降序排序。
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); } } }
結(jié)果如下:
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 實現(xiàn)了逆序比較。
Comparable比較器
Comparable 位于 java.lang 包下,本質(zhì)上是一個內(nèi)比較器,實現(xiàn)了 Comparable 的類可以自己比較,至于比較的結(jié)果如何則需要依賴于自然比較方法 compareTo 的實現(xiàn)。
compareTo 的返回值有 -1、0、1。若比較者大于被比較者,那么返回1,等于則返回0,小于返回-1。
Collections.sort
和 Arrays.sort
可以自動對實現(xiàn) Comparable 的對象進行排序。
示例如下,我們構(gòu)建一個 node 對象,并通過 node 對象之間的比較驗證 Comparable 的用法。
node 對象的實現(xiàn)如下:
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(); } }
可以看到,我們?yōu)?Node 實現(xiàn)了 Comparable 接口,并且重寫了 compareTo 方法。
先測試一下,我們創(chuàng)建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); } } }
顯示結(jié)果如下:
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
現(xiàn)在輸出是亂序的,接下來我們使用 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 的升序進行排序,現(xiàn)在排序結(jié)果如下:
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
總結(jié)
Comparable 是內(nèi)比較器,Comparator 是外比較器,若類沒有實現(xiàn) Comparable 接口但是需要對其進行排序,我們可以考慮使用 Comparator 。從另一個角度看,使用 Comparable 接口的耦合性大于 Comparator ,因為當(dāng)我們需要對比較算法進行修改的時候還需要修改 Comparable 的實現(xiàn)類。
關(guān)于java中的comparable與Comparator的區(qū)別就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。