首頁 >Java >Java入門 >java中的比較器comparable和Comparator的區別

java中的比較器comparable和Comparator的區別

王林
王林轉載
2019-11-27 13:20:312252瀏覽

java中的比較器comparable和Comparator的區別

Comparable比較器

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

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

Collections.sortArrays.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中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除