當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Java NavigableMap Interface用法及代碼示例


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 的層次結構

NavigableMap Interface in Java with Example

它實現了Map,SortedMap Interface接口。ConcurrentNavigableMap 擴展 NavigableMap。ConcurrentSkipListMapTreeMap實現 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 有兩個實現類,它們是ConcurrentSkipListMapTreeMap.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 



相關用法


注:本文由純淨天空篩選整理自佚名大神的英文原創作品 NavigableMap Interface in Java with Example。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。