NavigableMap接口是一個成員Java集合框架。它屬於java.util包,它是一個擴展SortedMap Interface提供了lowerKey、floorKey、ceilingKey、higherKey等便捷的導航方式,以及這種流行的導航方式。它還提供了從 Java 中現有的 Map 創建子 Map 的方法,例如headMap 的鍵小於指定的 key,tailMap 的鍵大於指定的 key,subMap 嚴格包含位於 toKey 和 fromKey 之間的鍵。
實現 NavigableMap 的示例類是TreeMap.
聲明:
public interface NavigableMap<K,V> extends SortedMap<K,V>
這裏,K 是鍵對象類型,V 是值對象類型。
NavigableMap 的層次結構
它實現了Map,SortedMap Interface接口。ConcurrentNavigableMap 擴展 NavigableMap。ConcurrentSkipListMap和TreeMap實現 NavigableMap。
例子:
Java
// Java program to demonstrate
// the NavigableMap interface
import java.util.NavigableMap;
import java.util.TreeMap;
public class NavigableMapExample {
public static void main(String[] args)
{
// Instantiate an object
// Since NavigableMap
// is an interface so we
// use TreeMap
NavigableMap<String, Integer> nm
= new TreeMap<String, Integer>();
// Add elements using put() method
nm.put("C", 888);
nm.put("Y", 999);
nm.put("A", 444);
nm.put("T", 555);
nm.put("B", 666);
nm.put("A", 555);
// Print the contents on the console
System.out.println("Mappings of NavigableMap : "
+ nm);
System.out.printf("Descending Set : %s%n",
nm.descendingKeySet());
System.out.printf("Floor Entry : %s%n",
nm.floorEntry("L"));
System.out.printf("First Entry : %s%n",
nm.firstEntry());
System.out.printf("Last Key : %s%n", nm.lastKey());
System.out.printf("First Key : %s%n",
nm.firstKey());
System.out.printf("Original Map : %s%n", nm);
System.out.printf("Reverse Map : %s%n",
nm.descendingMap());
}
}
輸出:
Mappings of NavigableMap : {A=555, B=666, C=888, T=555, Y=999} Descending Set : [Y, T, C, B, A] Floor Entry : C=888 First Entry : A=555 Last Key : Y First Key : A Original Map : {A=555, B=666, C=888, T=555, Y=999} Reverse Map : {Y=999, T=555, C=888, B=666, A=555}
實現類
NavigableMap 有兩個實現類,它們是ConcurrentSkipListMap和TreeMap.TreeMap是一個基於 Red-Black 樹的 NavigableMap 實現,它根據其鍵的自然順序或按Comparator Interface在Map創建時提供,具體取決於使用的構造函數。 TreeMap 的預期時間成本為日誌(n)用於插入、刪除和訪問操作。 TreeMap 未同步,必須在外部完成。
用法:
NavigableMap<K, V> objectName = new TreeMap<K, V>();
Basic Operations on NavigableMap
1. 添加元素
要將元素添加到 NavigableMap,我們可以使用 Map 接口的任何方法。下麵的代碼展示了如何使用它們。您可以在代碼中觀察到插入順序沒有保留。如果在構建時沒有提供比較器,則遵循自然順序。
Java
// Java program for adding elements
// to a NavigableMap
import java.util.*;
class AddingElementsExample {
public static void main(String args[])
{
// Instantiate an object
// Since NavigableMap is an interface
// We use TreeMap
NavigableMap<Integer, String> nmap
= new TreeMap<Integer, String>();
// Add elements using put()
nmap.put(3, "Geeks");
nmap.put(2, "For");
nmap.put(1, "Geeks");
// Print the contents on the console
System.out.println("Mappings of NavigableMap : "
+ nmap);
}
}
輸出:
Mappings of NavigableMap : {1=Geeks, 2=For, 3=Geeks}
2. 刪除元素
為了刪除元素,我們還使用 Map 接口的方法,因為 NavigableMap 是 Map 的後代。我們可以使用Map remove()方法,該方法獲取鍵值並從此樹形圖中刪除該鍵的映射(如果該映射存在於Map上)。我們可以用NavigableMap clear()刪除Map上的所有元素。
Java
// Java Program for deleting
// elements from NavigableMap
import java.util.*;
class RemovingElementsExample {
public static void main(String args[])
{
// Instantiate an object
// Since NavigableMap
// is an interface
// We use TreeMap
NavigableMap<Integer, String> nmap
= new TreeMap<Integer, String>();
// Add elements using put()
nmap.put(3, "Geeks");
nmap.put(2, "Geeks");
nmap.put(1, "Geeks");
nmap.put(4, "For");
// Print the contents on the console
System.out.println("Mappings of NavigableMap : "
+ nmap);
// Remove elements using remove()
nmap.remove(4);
// Print the contents on the console
System.out.println(
"\nNavigableMap, after remove operation : "
+ nmap);
// Clear the entire map using clear()
nmap.clear();
System.out.println(
"\nNavigableMap, after clear operation : "
+ nmap);
}
}
輸出:
Mappings of NavigableMap : {1=Geeks, 2=Geeks, 3=Geeks, 4=For} NavigableMap, after remove operation : {1=Geeks, 2=Geeks, 3=Geeks} NavigableMap, after clear operation : {}
3. 訪問元素
我們可以使用get()方法訪問NavigableMap的元素,下麵給出了示例。
Java
// Java Program for accessing
// elements in a NavigableMap
import java.util.*;
public class AccessingElementsExample {
public static void main(String[] args)
{
// Instantiate an object
// Since NavigableMap is an interface
// We use TreeMap
NavigableMap<Integer, String> nmap
= new TreeMap<Integer, String>();
// Add elements using put()
nmap.put(8, "Third");
nmap.put(6, "Second");
nmap.put(3, "First");
nmap.put(11, "Fourth");
// Accessing the elements using get()
// with key as a parameter
System.out.println(nmap.get(3));
System.out.println(nmap.get(6));
System.out.println(nmap.get(8));
System.out.println(nmap.get(11));
// Display the set of keys using keySet()
System.out.println("\nThe NavigableMap key set: "
+ nmap.keySet());
}
}
輸出:
First Second Third Fourth The NavigableMap key set: [3, 6, 8, 11]
4. 遍曆
我們可以使用Iterator interface來遍曆集合框架的任何結構。由於迭代器使用一種類型的數據,因此我們使用 Entry< ? , ? > 將兩種不同的類型解析為兼容的格式。然後使用 next() 方法打印 NavigableMap 的元素。另一種著名的方法是使用 for-each 循環並獲取 key 。使用getValue()方法找到鍵的值。
Java
// Java Program for traversing
// a NavigableMap
import java.util.*;
class TraversalExample {
public static void main(String args[])
{
// Instantiate an object
// Since NavigableMap is an interface
// We use TreeMap
NavigableMap<Integer, String> nmap
= new TreeMap<Integer, String>();
// Add elements using put()
nmap.put(3, "Geeks");
nmap.put(2, "For");
nmap.put(1, "Geeks");
// Create an Iterator over the
// NavigableMap
Iterator<NavigableMap.Entry<Integer, String> > itr
= nmap.entrySet().iterator();
System.out.println("Traversing using Iterator: ");
// The hasNext() method is used to check if there is
// a next element The next() method is used to
// retrieve the next element
while (itr.hasNext()) {
NavigableMap.Entry<Integer, String> entry
= itr.next();
System.out.println("Key = " + entry.getKey()
+ ", Value = "
+ entry.getValue());
}
System.out.println("Traversing using for-each: ");
// Iterate using for-each loop
for (Map.Entry mapElement : nmap.entrySet()) {
// get the key using getKey()
int key = (int)mapElement.getKey();
// Finding the value
String value = (String)mapElement.getValue();
System.out.println("Key = " + key
+ ", Value = " + value);
}
}
}
輸出:
Traversing using Iterator: Key = 1, Value = Geeks Key = 2, Value = For Key = 3, Value = Geeks Traversing using for-each: Key = 1, Value = Geeks Key = 2, Value = For Key = 3, Value = Geeks
注意:每次我們說“NavigableMap 的元素”時,都必須注意這些元素實際上存儲在 NavigableMap 的實現類的對象中,在本例中為 TreeMap。
NavigableMap的方法
NavigableMap繼承了Map接口、SortedMap接口的方法。添加元素、刪除元素和遍曆的基本方法由父接口給出。下表給出了NavigableMap的方法。這裏,
- K- Map中按鍵的類型。
- V- 映射中映射的值的類型。
METHOD |
DESCRIPTION |
---|---|
NavigableMap ceilingEntry() | 返回與大於或等於給定鍵的最小鍵關聯的鍵值映射,如果不存在這樣的鍵,則返回 null。 |
NavigableMap ceilingKey() | 返回大於或等於給定鍵的最小鍵,如果沒有這樣的鍵,則返回 null。 |
descendingKeySet() | 返回此映射中包含的鍵的逆序 NavigableSet 視圖。 |
descendingMap() | 返回此映射中包含的映射的逆序視圖。 |
NavigableMap firstEntry() | 返回與此映射中最小鍵關聯的鍵值映射,如果映射為空,則返回 null。 |
NavigableMap floorEntry() | 返回與小於或等於給定鍵的最大鍵關聯的鍵值映射,如果不存在這樣的鍵,則返回 null。 |
NavigableMap floorKey() | 返回小於或等於給定鍵的最大鍵,如果沒有這樣的鍵,則返回 null。 |
NavigableMap headMap() | 返回此映射的部分視圖,其鍵嚴格小於 toKey。 |
NavigableMap headMap() | 返回此映射中鍵小於(或等於,如果包含為 true)toKey 的部分的視圖。 |
NavigableMap higherEntry() | 返回與嚴格大於給定鍵的最小鍵關聯的鍵值映射,如果不存在這樣的鍵,則返回 null。 |
NavigableMap higherKey() | 返回嚴格大於給定鍵的最小鍵,如果不存在這樣的鍵,則返回 null。 |
NavigableMap lastEntry() | 返回與此映射中最大鍵關聯的鍵值映射,如果映射為空,則返回 null。 |
NavigableMap lowerEntry() | 返回與嚴格小於給定鍵的最大鍵關聯的鍵值映射,如果不存在這樣的鍵,則返回 null。 |
NavigableMap lowerKey() | 返回嚴格小於給定鍵的最大鍵,如果不存在這樣的鍵,則返回 null。 |
navigableKeySet() | 返回此映射中包含的鍵的 NavigableSet 視圖。 |
NavigableMap pollFirstEntry() | 刪除並返回與此映射中最小鍵關聯的鍵值映射,如果映射為空,則返回 null。 |
NavigableMap pollLastEntry() | 刪除並返回與此映射中最大鍵關聯的鍵值映射,如果映射為空,則返回 null。 |
subMap(K fromKey, 布爾值 從包含、K 到Key、布爾值到包含) |
返回此映射的部分視圖,其鍵範圍為 fromKey 到 toKey。 |
subMap(K fromKey, K toKey) | 返回此映射的部分視圖,其鍵範圍從 fromKey(包含)到 toKey(不包含)。 |
tailMap(K fromKey) | 返回此映射中鍵大於或等於 fromKey 的部分的視圖。 |
tailMap(K fromKey, 包含布爾值) | 返回此映射中鍵大於(或等於,如果包含為 true)fromKey 的部分的視圖。 |
從接口 java.util.SortedMap 繼承的方法
METHOD |
DESCRIPTION |
---|---|
SortedMap comparator() | 返回用於對該映射中的鍵進行排序的比較器,如果該映射使用其鍵的自然順序,則返回 null。 |
SortedMap entrySet() | 返回此映射中包含的映射的集合視圖。 |
SortedMap firstKey() | 返回當前此映射中的第一個(最低)鍵。 |
SortedMap keySet() | 返回此映射中包含的鍵的集合視圖。 |
SortedMap lastKey() | 返回當前此映射中的最後一個(最高)鍵。 |
SortedMap values() | 返回此映射中包含的值的集合視圖。 |
從接口 java.util.Map 繼承的方法
METHOD |
DESCRIPTION |
---|---|
Map clear() | 從此映射中刪除所有映射(可選操作)。 |
計算(K key, BiFunction<? super K,? super V,?擴展 V> 重映射函數) |
嘗試計算指定鍵及其當前映射值的映射(如果沒有當前映射,則為 null)。 |
computeIfAbsent(K key, Function<? super K,? 擴展 V> 映射函數) |
如果指定的鍵尚未與值關聯(或映射為 null),則嘗試使用給定的映射函數計算其值並將其輸入到此映射中,除非 null。 |
computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) | 如果指定鍵的值存在且非空,則嘗試在給定鍵及其當前映射值的情況下計算新映射。 |
Map containsKey() | 如果此映射包含指定鍵的映射,則返回 true。 |
Map containsValue() | 如果此映射將一個或多個鍵映射到指定值,則返回 true。 |
Map equals() | 比較指定對象與此映射是否相等。 |
forEach(BiConsumer<?超級 K,?超級 V> 操作) | 對此映射中的每個條目執行給定的操作,直到處理完所有條目或該操作引發異常。 |
Map get() | 返回指定鍵映射到的值,如果此映射不包含該鍵的映射,則返回 null。 |
getOrDefault(Object key, V defaultValue) | 返回指定鍵映射到的值,如果此映射不包含該鍵的映射,則返回 defaultValue。 |
Map hashCode() | 返回此映射的哈希代碼值。 |
Map isEmpty() | 如果此映射不包含鍵值映射,則返回 true。 |
merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction) | 如果指定的鍵尚未與值關聯或與 null 關聯,則將其與給定的非 null 值關聯。 |
Map put() | 將指定值與此映射中的指定鍵相關聯(可選操作)。 |
Map putAll() | 將指定映射中的所有映射複製到此映射(可選操作)。 |
putIfAbsent(K key, V value) | 如果指定的鍵尚未與值關聯(或映射為 null),則將其與給定值關聯並返回 null,否則返回當前值。 |
Map remove() | 從此映射中刪除鍵的映射(如果存在)(可選操作)。 |
remove(Object key, Object value) | 僅當指定鍵當前映射到指定值時,才刪除該條目。 |
replace(K key, V value) | 僅當指定鍵當前映射到某個值時才替換該條目。 |
replace(K key, V oldValue, V newValue) | 僅當當前映射到指定值時才替換指定鍵的條目。 |
ReplaceAll(BiFunction<? super K,? super V,? 擴展 V> 函數) | 將每個條目的值替換為在該條目上調用給定函數的結果,直到處理完所有條目或函數引發異常。 |
size() | 返回此映射中鍵值映射的數量。 |
參考:https://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html
相關用法
- Java NavigableMap ceilingEntry()用法及代碼示例
- Java NavigableMap ceilingKey()用法及代碼示例
- Java NavigableMap clear()用法及代碼示例
- Java NavigableMap firstEntry()用法及代碼示例
- Java NavigableMap floorEntry()用法及代碼示例
- Java NavigableMap floorKey()用法及代碼示例
- Java NavigableMap headMap()用法及代碼示例
- Java NavigableMap higherEntry()用法及代碼示例
- Java NavigableMap higherKey()用法及代碼示例
- Java NavigableMap isEmpty()用法及代碼示例
- Java NavigableMap lastEntry()用法及代碼示例
- Java NavigableMap lowerEntry()用法及代碼示例
- Java NavigableMap lowerKey()用法及代碼示例
- Java NavigableMap pollFirstEntry()用法及代碼示例
- Java NavigableMap pollLastEntry()用法及代碼示例
- Java NavigableMap put()用法及代碼示例
- Java NavigableMap size()用法及代碼示例
- Java NavigableSet add()用法及代碼示例
- Java NavigableSet addAll()用法及代碼示例
- Java NavigableSet ceiling()用法及代碼示例
- Java NavigableSet clear()用法及代碼示例
- Java NavigableSet descendingIterator()用法及代碼示例
- Java NavigableSet descendingSet()用法及代碼示例
- Java NavigableSet floor()用法及代碼示例
- Java NavigableSet headSet()用法及代碼示例
注:本文由純淨天空篩選整理自佚名大神的英文原創作品 NavigableMap Interface in Java with Example。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。