SortedSet接口
SortedSet是一個Set,它按升序維護其元素,根據元素的自然順序或根據SortedSet創建時提供的Comparator進行排序,除了常規的Set操作外,SortedSet接口還提供以下操作:
范圍視圖 — 允許對已排序集進行任意范圍操作。
端點 — 返回有序集合中的第一個或最后一個元素。
比較器訪問 — 返回用于對集合進行排序的Comparator(如果有)。
下面是SortedSet接口的代碼。
public interface SortedSetSet操作extends Set { // Range-view SortedSet subSet(E fromElement, E toElement); SortedSet headSet(E toElement); SortedSet tailSet(E fromElement); // Endpoints E first(); E last(); // Comparator access Comparator super E> comparator(); }
SortedSet從Set繼承的操作在有序集和普通集上的行為相同,但有兩個例外:
Iterator操作返回的iterator按順序遍歷有序集。
toArray返回的數組按順序包含有序集的元素。
雖然接口不保證它,但Java平臺的SortedSet實現的toString方法按順序返回包含有序集的所有元素的字符串。
標準構造函數按照慣例,所有通用Collection實現都提供了一個帶有Collection的標準轉換構造函數,SortedSet實現也不例外,在TreeSet中,此構造函數創建一個實例,根據其自然順序對其元素進行排序,這可能是一個錯誤,最好動態檢查以查看指定的集合是否是SortedSet實例,如果是,則根據相同的標準(比較器或自然排序)對新TreeSet進行排序。因為TreeSet采用了它所采用的方法,所以它還提供了一個構造函數,它接受一個SortedSet并返回一個新的TreeSet,它包含根據相同標準排序的相同元素。請注意,它是參數的編譯時類型,而不是其運行時類型,它確定調用這兩個構造函數中的哪一個(以及是否保留了排序條件)。
按照慣例,SortedSet實現還提供了一個構造函數,它接受一個Comparator并返回一個根據指定的Comparator排序的空集,如果將null傳遞給此構造函數,則返回一個集合,該集合根據其自然順序對其元素進行排序。
范圍視圖操作范圍視圖操作有點類似于List接口提供的操作,但有一個很大的區別,即使直接修改了后備排序集,排序集的范圍視圖仍然有效,這是可行的,因為有序集的范圍視圖的端點是元素空間中的絕對點,而不是后備集合中的特定元素,如列表的情況。排序集的范圍視圖實際上只是集合的任何部分位于元素空間的指定部分中的窗口,對范圍視圖的更改將寫回到后備排序集,反之亦然,因此,與列表上的范圍視圖不同,可以在很長一段時間內對已排序的集使用范圍視圖。
排序集提供三種范圍視圖操作,第一個subSet采用兩個端點,如subList,而不是索引,端點是對象,必須與有序集合中的元素相比較,使用Set的Comparator或其元素的自然順序,無論Set使用哪個自定義,與subList一樣,范圍是半開放的,包括其低端點但不包括高端點。
因此,下面的代碼行告訴你,包含在名為dictionary的字符串SortedSet中,“doorbell”和“pickle”之間有多少單詞,包括“doorbell”,但不包括“pickle”:
int count = dictionary.subSet("doorbell", "pickle").size();
以類似的方式,以下單行刪除以字母f開頭的所有元素。
dictionary.subSet("f", "g").clear();
類似的技巧可以用來打印一個表格,告訴你每個字母開頭有多少個單詞。
for (char ch = "a"; ch <= "z"; ) { String from = String.valueOf(ch++); String to = String.valueOf(ch); System.out.println(from + ": " + dictionary.subSet(from, to).size()); }
假設你要查看包含其兩個端點的封閉間隔,而不是開放的間隔,如果元素類型允許計算元素空間中給定值的后繼,則僅從subSet的lowEndpoint請求到successor(highEndpoint),雖然它并不完全明顯,但String的自然排序中的字符串s的后繼是s + "