對象的比較comparable與comparator

在java中,同一個類的實例之間經常需要進行比較。如果有兩個employee對象,你很可能需要知道他們之中哪一位在這家公司待的更久一些,或者希望按年齡升序或者降序排列之後再顯示搜索結果。通過實現java.lang.Comparable和java.uti.Comparator接口,可以使對象具有可比較性。

一、使用java.lang.Comparable

實現了java.lang.Comparable接口,就必須重寫它的抽象方法compareTo()

public int compareTo(T o);

	@Override
	public int compareTo(Person o) {
		if (this.age > o.age) {
			return 1;
		} else if (this.age < o.age) {
			return -1;
		} 
		return 0;
	}

這樣這個對象就具備了比較性,並且使用java.util.Arrays的靜態方法sort可以對任意對象數組進行排序。compareTo方法中的參數o是指這個對象進行比較的對象。如果這個對象大於參數對象,這個方法在實現類中的代碼就必須返回一個正值;如果這個對象小於參數對象,則返回一個負值。默認這個規則是升序的,若想降序,則可以使正負值相調換即可。

二、實現java.lang.Comparator

實現java.lang.Comparable使你能夠定義一種對類的實例進行比較的方法。然而,對象有的時候可以通過多種方式進行比較。例如,倆個Person對象可能需要按照年齡或者姓名比較,這時使用第一種方式就不行了,因爲第一種方式只能在類中定義一種比較。爲了使對象具有倆種比較方式,這就需要實現java.lang.Comparator接口,定義兩個比較器來進行比較。重寫抽象方法compare

int compare(T o1, T o2);
	@Override
	public int compare(Person o1, Person o2) {
		if (o1.getAge() > o2.getAge()) {
			return 1;
		} else if (o1.getAge() < o2.getAge()) {
			return -1;
		}
		return 0;
	}

另外再依照這個比較器重寫一個按姓名比較的比較器,此處偷懶!

集合排序或者是數組排序都有傳入比較器進行比較或者排序的方法。下圖是Collections和Arrays的帶有比較器的排序方法

    public static <T> void sort(List<T> list, Comparator<? super T> c) {
        list.sort(c);
    }

   public static <T> void sort(T[] a, Comparator<? super T> c)

三、總結

兩種方法各有優劣, 用Comparable 簡單, 只要實現Comparable 接口的對象直接就成爲一個可以比較的對象,但是需要修改源代碼,。用Comparator 的好處是不需要修改源代碼, 而是另外實現一個比較器, 當某個自定義的對象需要作比較的時候,把比較器和對象一起傳遞過去就可以比大小了, 並且在Comparator 裏面用戶可以自己實現複雜的可以通用的邏輯,使其可以匹配一些比較簡單的對象,那樣就可以節省很多重複勞動了。


發佈了40 篇原創文章 · 獲贊 22 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章