当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。