溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java中的comparable與Comparator有區(qū)別嗎

發(fā)布時間:2020-06-23 19:38:39 來源:億速云 閱讀:103 作者:元一 欄目:編程語言

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.sortArrays.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é)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責(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)容。

AI