溫馨提示×

溫馨提示×

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

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

java中的comparable與Comparator有區別嗎

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

java中的comparable與Comparator有區別嗎?針對這個問題,這篇文章給出了相對應的分析和解答,希望能幫助更多想解決這個問題的朋友找到更加簡單易行的辦法。

在Java代碼中,我們常常會面臨需要對集合進行排序的情況,這種情況下我們需要手動的定義Java比較器,告訴程序兩個對象如何比較大小。Comparable和Comparator接口都是為了對類進行比較,眾所周知,諸如Integer,double等基本數據類型,java可以對他們進行比較,而對于類的比較,需要人工定義比較用到的字段比較邏輯??梢园袰omparable理解為內部比較器,而Comparator是外部比較器。

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比較器

Comparable 位于 java.lang 包下,本質上是一個內比較器,實現了 Comparable 的類可以自己比較,至于比較的結果如何則需要依賴于自然比較方法 compareTo 的實現。

compareTo 的返回值有 -1、0、1。若比較者大于被比較者,那么返回1,等于則返回0,小于返回-1。

Collections.sortArrays.sort 可以自動對實現 Comparable 的對象進行排序。

示例如下,我們構建一個 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

總結

Comparable 是內比較器,Comparator 是外比較器,若類沒有實現 Comparable 接口但是需要對其進行排序,我們可以考慮使用 Comparator 。從另一個角度看,使用 Comparable 接口的耦合性大于 Comparator ,因為當我們需要對比較算法進行修改的時候還需要修改 Comparable 的實現類。

關于java中的comparable與Comparator的區別就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女