基於源碼的Java集合框架學習⑫ SortedMap接口

接口 SortedMap<K,V>

保證按照鍵的升序排列的映射,可以按照鍵的自然順序(參見 Comparable 接口)進行排序,或者通過創建有序映射時提供的比較器進行排序。對有序映射的集合視圖(由 entrySet、keySet 和 values 方法返回)進行迭代時,此順序就會反映出來。要採用此排序,還需要提供一些其他操作(此接口是相似於 SortedSet 接口的映射)。

插入有序映射的所有鍵都必須實現 Comparable 接口(或者被指定的比較器所接受)。另外,所有這些鍵都必須是可互相比較的:k1.compareTo(k2)(或 comparator.compare(k1, k2))對有序映射中的任意兩個元素 k1 和 k2 都不得拋出 ClassCastException。試圖違反這些限制將導致違反方法或者構造方法的調用,從而拋出 ClassCastException。

注意,如果有序映射正確實現了 Map 接口,則有序映射所保持的順序(無論是否明確提供了比較器)都必須保持相等一致性。(相等一致性 的精確定義請參閱 Comparable 接口或 Comparator 接口)。這也是因爲 Map 接口是按照 equals 操作定義的,但有序映射使用它的 compareTo(或 compare)方法對所有鍵進行比較,因此從有序映射的觀點來看,此方法認爲相等的兩個鍵就是相等的。即使順序沒有保持相等一致性,樹映射的行爲仍然是 定義良好的,只不過沒有遵守 Map 接口的常規協定。

所有通用有序映射實現類都應該提供 4 個“標準”構造方法:1) void(不帶參數)構造方法,創建空的有序映射,按照鍵的自然順序 排序。2) 帶有一個 Comparator 類型參數的構造方法,創建一個空的有序映射,根據指定的比較器排序。3) 帶有一個 Map 類型參數的構造方法,創建一個鍵-值映射關係與參數相同的有序映射,按照鍵的自然順序排序。4) 帶有一個有序映射類型參數的構造方法,創建一個新的有序映射,鍵-值映射關係及排序方法與輸入的有序映射相同。除了 JDK 實現(TreeMap 類)遵循此建議外,無法保證強制實施此建議(因爲接口不能包含構造方法)。

方法

Comparator<? super K> comparator() 
返回與此有序映射關聯的比較器,如果使用鍵的自然順序,則返回 null。 
K firstKey() 
返回有序映射中當前第一個(最小的)鍵。 
SortedMap<K,V> headMap(K toKey) 
返回此有序映射的部分視圖,其鍵值嚴格小於 toKey。 
K lastKey() 
返回有序映射中當前最後一個(最大的)鍵。 
SortedMap<K,V> subMap(K fromKey, K toKey) 
返回此有序映射的部分視圖,其鍵值從 fromKey(包括)到 toKey(不包括)。 
SortedMap<K,V> tailMap(K fromKey) 
返回有序映射的部分視圖,其鍵大於或等於 fromKey。 

接口 NavigableMap<K,V>

NavigableMap擴展了 SortedMap,具有了針對給定搜索目標返回最接近匹配項的導航方法。方法 lowerEntry、floorEntry、ceilingEntry 和 higherEntry 分別返回與小於、小於等於、大於等於、大於給定鍵的鍵關聯的 Map.Entry 對象,如果不存在這樣的鍵,則返回 null。類似地,方法 lowerKey、floorKey、ceilingKey 和 higherKey 只返回關聯的鍵。所有這些方法是爲查找條目而不是遍歷條目而設計的。

可以按照鍵的升序或降序訪問和遍歷 NavigableMap。descendingMap 方法返回映射的一個視圖,該視圖表示的所有關係方法和方向方法都是逆向的。升序操作和視圖的性能很可能比降序操作和視圖的性能要好。subMap、headMap 和 tailMap 方法與名稱相似的 SortedMap 方法的不同之處在於:可以接受用於描述是否包括(或不包括)下邊界和上邊界的附加參數。任何 NavigableMap 的 Submap 必須實現 NavigableMap 接口。

此接口還定義了 firstEntry、pollFirstEntry、lastEntry 和 pollLastEntry 方法,它們返回和/或移除最小和最大的映射關係(如果存在),否則返回 null。

subMap(K, K)、headMap(K) 和 tailMap(K) 方法被指定爲返回 SortedMap,以允許現有 SortedMap 實現能相容地改進爲實現 NavigableMap,但鼓勵此接口的擴展和實現重寫這些方法以返回 NavigableMap。類似地,可以重寫 SortedMap.keySet() 以返回 NavigableSet。

方法

Map.Entry<K,V> ceilingEntry(K key) 
返回一個鍵-值映射關係,它與大於等於給定鍵的最小鍵關聯;如果不存在這樣的鍵,則返回 null。

K ceilingKey(K key) 
返回大於等於給定鍵的最小鍵;如果不存在這樣的鍵,則返回 null。

NavigableSet<K> descendingKeySet() 
返回此映射中所包含鍵的逆序 NavigableSet 視圖。

NavigableMap<K,V> descendingMap() 
返回此映射中所包含映射關係的逆序視圖。

Map.Entry<K,V> firstEntry() 
返回一個與此映射中的最小鍵關聯的鍵-值映射關係;如果映射爲空,則返回 null。

Map.Entry<K,V> floorEntry(K key) 
返回一個鍵-值映射關係,它與小於等於給定鍵的最大鍵關聯;如果不存在這樣的鍵,則返回 null。

K floorKey(K key) 
返回小於等於給定鍵的最大鍵;如果不存在這樣的鍵,則返回 null。

SortedMap<K,V> headMap(K toKey) 
返回此映射的部分視圖,其鍵值嚴格小於 toKey。

NavigableMap<K,V> headMap(K toKey, boolean inclusive) 
返回此映射的部分視圖,其鍵小於(或等於,如果 inclusive 爲 true)toKey。

Map.Entry<K,V> higherEntry(K key) 
返回一個鍵-值映射關係,它與嚴格大於給定鍵的最小鍵關聯;如果不存在這樣的鍵,則返回 null。

K higherKey(K key)  
返回嚴格大於給定鍵的最小鍵;如果不存在這樣的鍵,則返回 null。

Map.Entry<K,V> lastEntry() 
返回與此映射中的最大鍵關聯的鍵-值映射關係;如果映射爲空,則返回 null。

Map.Entry<K,V> lowerEntry(K key) 
返回一個鍵-值映射關係,它與嚴格小於給定鍵的最大鍵關聯;如果不存在這樣的鍵,則返回 null。

K lowerKey(K key) 
返回嚴格小於給定鍵的最大鍵;如果不存在這樣的鍵,則返回 null。

NavigableSet<K> navigableKeySet() 
返回此映射中所包含鍵的 NavigableSet 視圖。

Map.Entry<K,V> pollFirstEntry() 
移除並返回與此映射中的最小鍵關聯的鍵-值映射關係;如果映射爲空,則返回 null。

Map.Entry<K,V> pollLastEntry() 
移除並返回與此映射中的最大鍵關聯的鍵-值映射關係;如果映射爲空,則返回 null。

NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) 
返回此映射的部分視圖,其鍵的範圍從 fromKey 到 toKey。

SortedMap<K,V> subMap(K fromKey, K toKey) 
返回此映射的部分視圖,其鍵值的範圍從 fromKey(包括)到 toKey(不包括)。

SortedMap<K,V> tailMap(K fromKey) 
返回此映射的部分視圖,其鍵大於等於 fromKey。

NavigableMap<K,V> tailMap(K fromKey, boolean inclusive) 
返回此映射的部分視圖,其鍵大於(或等於,如果 inclusive 爲 true)fromKey。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章