public interface Comparator<T>
比較函數強行對某些對象 collection 進行整體排序。可以將 Comparator 傳遞給 sort 方法(如 Collections.sort),從而允許在排序順序上實現精確控制。還可以使用 Comparator 來控制某些數據結構(如 TreeSet 或 TreeMap)的順序。
當且僅當對於一組元素 S 中的每個 e1 和 e2 而言,(compare((Object)e1, (Object)e2)==0) 與 e1.equals((Object)e2) 具有相等的布爾值時,Comparator c 強行對 S 進行的排序才叫做與等號一致 的排序。
當使用具有與等號一致的強行排序能力的 comparator 對有序 set(或有序映射)進行排序時,應該小心謹慎。假定一個帶有顯式 Comparator c 的有序 set(或有序映射)與從 set S 中抽取出來的元素(或鍵)一起使用。如果 c 強行對 S 進行的排序與等號一致,那麼有序 set(或有序映射)將是行為“怪異的”。尤其是那些將違背根據 equals 所定義 set(或映射)的常規協定的有序 set(或有序映射)。
例如,如果使用 comparator c 將滿足 (a.equals((Object)b) && c.compare((Object)a, (Object)b) != 0) 的兩個鍵 a 和 b 添加到有序 set 中,則第二個 add 操作將返回 false(有序 set 的大小沒有增加),因為從有序 set 的角度來看,a 和 b 是相等的。
注:通常用 comparator 來實現 java.io.Serializable 是一個好主意,因為它們在可序列化的數據結構(像 TreeSet、TreeMap)中可用作排序方法。為了成功地序列化數據結構,comparator(如果已提供)必須實現 Serializable。
在算術上,定義給定 comparator c 對給定對象 set S 強行實施整體排序 的關系式 為:
{(x, y) such that c.compare((Object)x, (Object)y) <= 0}.
整體排序的商 是:{(x, y) such that c.compare((Object)x, (Object)y) == 0}.
它直接遵循 compare 的協定,商是 S 上的等價關系,自然順序是 S 上的整體排序。當我們說 c 強行對 S 的排序是與等號一致 時,意思是說自然排序的商是對象的 equals(Object) 方法所定義的等價關系:
{(x, y) such that x.equals((Object)y)}.
此接口是 Java Collections Framework 的成員。
從以下版本開始: 1.2 另請參見: Comparable, Arrays.sort(Object[], Comparator), TreeMap, TreeSet, SortedMap, SortedSet, Serializable
方法摘要
int
compare(To1, To2)
比較用來排序的兩個參數。
boolean
equals(Objectobj)
指示是否其他對象“等於”此 Comparator。
方法詳細信息
compareint compare(To1,
比較用來排序的兩個參數。隨第一個參數小於、等於或大於第二個參數而分別返回負整數、零或正整數。
To2)
實現程序必須確保對於所有的 x 和 y 而言,都存在 sgn(compare(x, y)) == -sgn(compare(y, x))。(這意味著當且僅當 compare(y, x) 拋出異常時 compare(x, y) 才必須拋出異常。)
實現程序還必須確保關系是可傳遞的:((compare(x, y)>0) && (compare(y, z)>0)) 意味著 compare(x, z)>0。
最後,實現程序必須確保 compare(x, y)==0 意味著對於所有的 z 而言,都存在 sgn(compare(x, z))==sgn(compare(y, z))。
雖然這種情況很普遍,但並不 嚴格要求 (compare(x, y)==0) == (x.equals(y))。一般說來,任何違背了這一點的 comparator 都應該清楚地指出這一事實。推薦的語言是“注意:此 comparator 強行進行與等號一致的排序。”
參數: o1 - 要比較的第一個對象。 o2 - 要比較的第二個對象。 返回: 隨第一個參數小於、等於或大於第二個參數而分別返回負整數、零或正整數。 拋出: ClassCastException - 如果參數的類型不允許此 Comparator 對它們進行比較。equalsboolean equals(Objectobj)
指示是否其他對象“等於”此 Comparator。此方法必須遵守 Object.equals(Object) 的常規協定。此外,僅當 指定的 Object 也是一個 comparator,並且強行實現與此 comparator 相同的排序時,此方法才返回 true。因此,comp1.equals(comp2) 意味著對於每個對象引用 o1 和 o2 而言,都存在 sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))。
注意,不 重寫 Object.equals(Object) 方法總是 安全的。然而,在某些情況下,重寫此方法可以允許程序確定兩個不同的 Comparator 是否強行實現了相同的排序,從而提高性能。
覆蓋: 類 Object 中的 equals參數: obj - 要進行比較的引用對象。 返回: 僅當指定的對象也是一個 comparator,並且強行實現與此 comparator 相同的排序時才返回 true。 另請參見: Object.equals(java.lang.Object), Object.hashCode()