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