NavigableMap(java.util.NavigableMap
)接口是SortedMap
的子接口,但是 NavigableMap
接口中新加了几个SortedSet接口中没有的方法,使导航存储在映射中的键和值成为可能,本文会讲解。
NavigableMap的实现
既然是接口,那就必须用到它的实现,java.util
包中只有一个实现
java.util.TreeMap
,另外java.util.concurrent
包中也有实现,但是本文不讲解。
创建NavigableMap
为了创建NavigableMap ,则必须使用它实现的实例,下面是代码:
NavigableMap navigableMap = new TreeMap();
使用Comparator创建NavigableMap
可以使用Comparator
得实现作为TreeMap构造函数得参数,
然后,这个Comparator
将用于对存储在NavigableMap中的键、值对的键进行排序:
Comparator comparator = new MyComparatorImpl();
SortedMap sortedMap = new TreeMap(comparator);
descendingKeySet()
返回一个所有key键的视图,顺序是倒序:
NavigableSet reverse = map.descendingKeySet();
descendingMap()
返回一个与原map反向顺序的视图,仍然是同一个map,操作会互相影响:
NavigableMap descending = map.descendingMap();
headMap()
返回小于第一个参数的键值对的视图(如果第二个参数为true代表包含等于):
NavigableMap original = new TreeMap();
original.put("1", "1");
original.put("2", "2");
original.put("3", "3");
//this headmap1 will contain "1" and "2"
SortedMap headmap1 = original.headMap("3");
//this headmap2 will contain "1", "2", and "3" because "inclusive"=true
NavigableMap headmap2 = original.headMap("3", true);
tailMap()
tailMap()
方法和headMap()方法很小,除了返回的大于等会给定key的视图:
NavigableMap navigableMap = new TreeMap();
navigableMap.put("a", "1");
navigableMap.put("c", "3");
navigableMap.put("e", "5");
navigableMap.put("d", "4");
navigableMap.put("b", "2");
SortedMap tailMap = navigableMap.tailMap("c");
tailMap
的值是包含了key为"c"
, "d"
和 "e"
的键值对的SortedMap,因为这些key的值大于等于"c"。
subMap()
返回fromKey到toKey的map视图,通过fromInclusive与toInclusive控制是否包含:
NavigableMap original = new TreeMap();
original.put("1", "1");
original.put("2", "2");
original.put("3", "3");
original.put("4", "4");
original.put("5", "5");
//this submap1 will contain "3", "3"
SortedMap submap1 = original.subMap("2", "4");
//this submap2 will contain ("2", "2") ("3", "3") and ("4", "4") because
// fromInclusive=true, and toInclusive=true
NavigableMap submap2 = original.subMap("2", true, "4", true);
ceilingKey()
返回最接近的大于等于key的键:
NavigableMap original = new TreeMap();
original.put("1", "1");
original.put("2", "2");
original.put("3", "3");
//ceilingKey will be "2".
Object ceilingKey = original.ceilingKey("2");
floorKey()
floorKey()
方法和ceilingKey()方法相对应,返回小于且最接近key的键(包含等于)
:
NavigableMap original = new TreeMap();
original.put("1", "1");
original.put("2", "2");
original.put("3", "3");
//floorKey will be "2".
Object floorKey = original.floorKey("2");
floorKey
的接口将是2,因为对应的key
"2"小于或者等于 "2"
。
higherKey()
返回最接近的大于key的键:
NavigableMap original = new TreeMap();
original.put("1", "1");
original.put("2", "2");
original.put("3", "3");
//higherKey will be "3".
Object higherKey = original.higherKey("2");
lowerKey()
返回小于且最接近key的键(不包含等于) :
NavigableMap original = new TreeMap();
original.put("1", "1");
original.put("2", "2");
original.put("3", "3");
//lowerKey will be "1"
Object lowerKey = original.lowerKey("2");
上面例子lowerKey
的值是
"1"
,因为这是key小于"2"
对应的最大值。
celingEntry(), floorEntry(), higherEntry(), lowerEntry()
NavigableMap还提供了一些方法来获取给定键的entry,而不是键本身,这些方法和ceilingKey()
方法很小,只不过返回的是
Map.Entry
而不是key对象本身,Map.Entry映射的是单个
key和value。
ceilingEntry()
找到第一个大于或等于指定key的Map.Entry
:
NavigableMap original = new TreeMap();
navigableMap.put("a", "1");
navigableMap.put("c", "3");
navigableMap.put("e", "5");
navigableMap.put("d", "4");
navigableMap.put("b", "2");
//ceilingEntry will be ("c", "3").
Map.Entry ceilingEntry = navigableMap.ceilingEntry("c");
上面例子中ceilingEntry
的值包含
key "c"
和value "3"
,因为 "c"
是大于或者等于
"c"
的最小值。
floorEntry()
floorEntry()
方法和ceilingEntry()方法相对,找到第一个小于或等于指定key的Map.Entry
:
NavigableMap original = new TreeMap();
navigableMap.put("a", "1");
navigableMap.put("c", "3");
navigableMap.put("e", "5");
navigableMap.put("d", "4");
navigableMap.put("b", "2");
//floorEntry will be ("c, "3").
Map.Entry floorEntry = navigableMap.floorEntry("c");
上面例子中floorEntry
的值是
"c"
+ "3"
,因为"c"
是小于或者等于 "c"
的最大值
。
higherEntry()
higherEntry()
找到第一个大于指定key的值
:
NavigableMap original = new TreeMap();
navigableMap.put("a", "1");
navigableMap.put("c", "3");
navigableMap.put("e", "5");
navigableMap.put("d", "4");
navigableMap.put("b", "2");
//higherEntry will be ("d", "4").
Map.Entry higherEntry = original.higherEntry("c");
higherEntry
的值是
"d"
和 "4"
的键值对,因为"d"
是大于 "c"
的最小值。
lowerEntry()
lowerEntry()
方法找到第一个比指定的key小的值
:
NavigableMap original = new TreeMap();
navigableMap.put("a", "1");
navigableMap.put("c", "3");
navigableMap.put("e", "5");
navigableMap.put("d", "4");
navigableMap.put("b", "2");
//lowerEntry will be ("a", "1")
Map.Entry lowerEntry = original.lowerEntry("b");
lowerEntry
返回的键值是
"a"
+ "1"
,因为
"a"
是小于"b"的最大值。
pollFirstEntry()
pollFirstEntry()
移除第一个
entry (key + value)并返回,如果NavigableMap
是空的话返回
null:
NavigableMap original = new TreeMap();
navigableMap.put("a", "1");
navigableMap.put("c", "3");
navigableMap.put("e", "5");
navigableMap.put("d", "4");
navigableMap.put("b", "2");
//first is ("a", "1")
Map.Entry first = original.pollFirstEntry();
First
的值是
"a"
+ "1"
,因为 "a"
是第一个key。
pollLastEntry()
pollLastEntry()
返回map中的最后一个元素,如果map是空的话返回null:
NavigableMap original = new TreeMap();
navigableMap.put("a", "1");
navigableMap.put("c", "3");
navigableMap.put("e", "5");
navigableMap.put("d", "4");
navigableMap.put("b", "2");
//first is ("e", "5")
Map.Entry last = original.pollLastEntry();
Last
的值是
"e"
+ "5"
,因为
"e"
是map中的最后一个元素。
参考:
https://blog.youkuaiyun.com/cgsyck/article/details/108462189
http://tutorials.jenkov.com/java-collections/navigablemap.html