当前教程
使用 SortedMap 和 NavigableMap 保持键排序
系列中的下一篇

系列中的上一篇: 使用 Lambda 表达式处理 Map 值

系列中的下一篇: 为您的键选择不可变类型

使用 SortedMap 和 NavigableMap 保持键排序

 

SortedMap 添加的方法

JDK 提供了 Map 接口的两个扩展:SortedMapNavigableMapNavigableMapSortedMap 的扩展。这两个接口都由同一个类实现:TreeMapTreeMap 类是红黑树,一种众所周知的数据结构。

SortedMapNavigableMap 按键对它们的键值对进行排序。就像 SortedSetNavigableSet 一样,您需要提供一种比较这些键的方法。您有两个解决方案可以做到这一点:要么您的键的类实现 Comparable,要么在创建 TreeMap 时为您的键提供一个 Comparator。如果您提供了一个 Comparator,即使您的键是可比较的,它也会被使用。

如果您为 SortedMapNavigableMap 选择的实现是 TreeMap,那么您可以安全地将 keySet()entrySet() 调用的返回的集合转换为 SortedSetNavigableSetNavigableMap 有一个方法,navigableKeySet(),它返回一个 NavigableSet 的实例,您可以使用它来代替普通的 keySet() 方法。两种方法都返回同一个对象。

SortedMap 接口向 Map 添加了以下方法

这些地图是 SortedMap 的实例,并且是此地图支持的视图。对地图所做的任何更改都将在这些视图中看到。这些视图可以更新,但有一个限制:您不能插入超出您构建的地图边界的键。

您可以在以下示例中看到此行为

SortedMap<Integer, String> map = new TreeMap<>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");
map.put(5, "five");
map.put(6, "six");

SortedMap<Integer, String> headMap = map.headMap(3);
headMap.put(0, "zero"); // this line is ok
headMap.put(4, "four"); // this line throws an IllegalArgumentException

 

NavigableMap 添加的方法

访问特定键或条目

NavigableMapSortedMap 添加了更多方法。第一组方法让您可以访问地图中的特定键和条目。

使用队列式功能访问您的地图

第二组为您提供队列式功能

以反向顺序遍历您的地图

第三组反转您的地图,就好像它是在反向比较逻辑上构建的一样。

这两个视图都支持元素删除,但您不能通过它们添加任何内容。

以下是一个演示如何使用它们的示例。

NavigableMap<Integer, String> map = new TreeMap<>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");
map.put(4, "four");
map.put(5, "five");

map.keySet().forEach(key -> System.out.print(key + " "));
System.out.println();

NavigableSet<Integer> descendingKeys = map.descendingKeySet();
descendingKeys.forEach(key -> System.out.print(key + " "));

运行此代码将打印出以下结果。

1 2 3 4 5 
5 4 3 2 1 

获取子映射视图

最后一组方法使您可以访问映射部分的视图。

这些映射是此映射的视图,您可以通过删除或添加键值对来更新它们。不过,添加元素有一个限制:您不能添加超出视图创建边界之外的键。


上次更新: 2021 年 9 月 14 日


当前教程
使用 SortedMap 和 NavigableMap 保持键排序
系列中的下一篇

系列中的上一篇: 使用 Lambda 表达式处理 Map 值

系列中的下一篇: 为您的键选择不可变类型