熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

如何給一個對象排序

2013-11-23 19:15:08  來源: Java核心技術 

  當我們排序的對象不止是簡單的數據類型的時候

  我們可以通過 實現Comparable 和Comparator 接口來完整對 對象的排序

  Comparable和Compartor 的區別?

  Comparable 是一個自身已經支持自比較的(如String Integer) 的接口

  Comparator 可以說是一個 專用的比較器 當對象本身 不支持自排序和自比較函數的時候

  我們可以通過實現Compartor 來比較兩對象的大小

  Comparable 是一個比較通用的接口 用戶可以通過他實現 排序功能

  而 Comparator 可以看作一種算法 一種設計模式 (可以看作是一個策略模式 就是不改變對象自身而用一個策略對象改變對象行為)

  Comparable 相對比較固定 與具體類綁定

  Comparator 比較靈活 可以與任何需要實現功能的類 綁定

  Comparable 可以說是 靜態綁定

  Comparator 可以說是動態綁定

  Comparable

  此接口強行對實現它的每個類的對象進行整體排序此排序被稱為該類的自然排序類的 compareTo 方法被稱為它的自然比較方法

  實現此接口的對象列表(和數組)可以通過 Collectionssort(和 Arrayssort)進行自動排序實現此接口的對象可以用作有序映射表中的鍵或有序集合中的元素無需指定比較器

  對於類 C 的每一個 e 和 e 來說當且僅當 (pareTo((Object)e) == ) 與 eequals((Object)e) 具有相同的布爾值時類 C 的自然排序才叫做與 equals 一致注意null 不是任何類的實例即使 eequals(null) 返回 falsepareTo(null) 也會拋出 NullPointerException

  強烈推薦(雖然不是必需的)使自然排序與 equals 一致這是因為在使用其自然排序與 equals 不一致的元素(或鍵)時沒有顯式比較器的有序集合(和有序映射表)行為表現怪異尤其是這樣的有序集合(或有序映射表)違背了根據 equals 方法定義的集合(或映射表)的常規協定

  而 Comparator

  比較函數強行對某些對象 collection 進行整體排序可以將 Comparator 傳遞給 sort 方法(如 Collectionssort)從而允許在排序順序上實現精確控制還可以使用 Comparator 來控制某些數據結構(如 TreeSet 或 TreeMap)的順序

  當且僅當對於一組元素 S 中的每個 e 和 e 而言(compare((Object)e (Object)e)==) 與 eequals((Object)e) 具有相等的布爾值時Comparator c 強行對 S 進行的排序才叫做與等號一致 的排序

  當使用具有與等號一致的強行排序能力的 comparator 對有序 set(或有序映射)進行排序時應該小心謹慎假定一個帶有顯式 Comparator c 的有序 set(或有序映射)與從 set S 中抽取出來的元素(或鍵)一起使用如果 c 強行對 S 進行的排序與等號一致那麼有序 set(或有序映射)將是行為怪異的尤其是那些將違背根據 equals 所定義 set(或映射)的常規協定的有序 set(或有序映射)


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26524.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.