258. Java 集合 - 深入探究 NavigableMap:新增方法助力高效数据处理

NavigableMap 是 SortedMap 的扩展,它增加了一些方法,使得在有序 Map 中操作更加灵活。通过这些方法,你可以更方便地访问特定的键或条目,利用队列特性操作数据,或者在反向顺序下遍历 Map。

一、访问特定键或条目

NavigableMap 提供了一些方法,用于获取特定的键或条目:

  1. firstKey() 和 firstEntry() :返回 Map 中的最小键或最小键值对。
  2. lastKey() 和 lastEntry() :返回 Map 中的最大键或最大键值对。
  3. ceilingKey(key) 和 ceilingEntry(key):返回大于或等于指定键的最小键或键值对。
  4. higherKey(key) 和 higherEntry(key):返回大于指定键的最小键或键值对(严格大于)。
  5. floorKey(key) 和 floorEntry(key):返回小于或等于指定键的最大键或键值对。
  6. lowerKey(key) 和 lowerEntry(key):返回小于指定键的最大键或键值对(严格小于)。

这些方法使你可以精确控制对 Map 中元素的访问。

示例:
java 复制代码
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");

System.out.println("First Key: " + map.firstKey()); // 输出 1
System.out.println("Last Key: " + map.lastKey());   // 输出 5

System.out.println("Ceiling Key of 3: " + map.ceilingKey(3));  // 输出 3
System.out.println("Higher Key of 3: " + map.higherKey(3));    // 输出 4

System.out.println("Floor Key of 3: " + map.floorKey(3));      // 输出 3
System.out.println("Lower Key of 3: " + map.lowerKey(3));      // 输出 2

二、队列式特性:从 Map 中取出元素

NavigableMap 提供了一些方法,使得 Map 具有类似队列的操作功能:

  1. pollFirstEntry() :返回并移除 Map 中最小的键值对。
  2. pollLastEntry() :返回并移除 Map 中最大的键值对。

这些方法使得我们可以模拟从 Map 的两端删除元素。

示例:
java 复制代码
NavigableMap<Integer, String> map = new TreeMap<>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");
map.put(4, "four");

System.out.println("Poll First Entry: " + map.pollFirstEntry());  // 输出 1=one
System.out.println("Poll Last Entry: " + map.pollLastEntry());    // 输出 4=four

map.forEach((key, value) -> System.out.println(key + " :: " + value));

三、反向遍历 Map

NavigableMap 还提供了一些方法,用于反向遍历 Map。你可以通过这些方法,按照降序遍历键值对。

  1. navigableKeySet() :返回一个 NavigableSet,你可以通过它按顺序访问 Map 中的所有键。
  2. descendingKeySet() :返回一个 NavigableSet,你可以通过它反向访问 Map 中的键。
  3. descendingMap() :返回一个新的 NavigableMap,它是原始 Map 的反向视图。

这些方法使得我们能够轻松实现对 Map 键的反向遍历。

示例:
java 复制代码
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 + " "));  // 输出 1 2 3 4 5
System.out.println();

// 反向遍历
NavigableSet<Integer> descendingKeys = map.descendingKeySet();
descendingKeys.forEach(key -> System.out.print(key + " "));  // 输出 5 4 3 2 1

四、获取子集视图

NavigableMap 还提供了几个方法,用于获取 Map 的子集视图。这些视图是原始 Map 的视图,任何对这些视图的更改都会反映到原始 Map 中。

  1. subMap(fromKey, fromInclusive, toKey, toInclusive):返回一个子集视图,可以指定是否包含边界键。
  2. headMap(toKey, inclusive) :返回一个子集视图,其中包含小于 toKey 的键,并可以指定是否包含 toKey。
  3. tailMap(fromKey, inclusive) :返回一个子集视图,其中包含大于或等于 fromKey 的键,并可以指定是否包含 fromKey。

这些方法允许你更精细地控制对 Map 中部分元素的访问。

示例:
java 复制代码
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");

// 获取从 2 到 4 的子集视图(包括边界)
NavigableMap<Integer, String> subMap = map.subMap(2, true, 4, true);
subMap.forEach((key, value) -> System.out.println(key + " :: " + value));
运行结果:
java 复制代码
2 :: two
3 :: three
4 :: four

总结

  • NavigableMap 提供了更强大和灵活的操作,能够让我们通过一系列方法(如 firstKey()、ceilingKey()、pollFirstEntry())更加精确地访问、修改和遍历 Map。
  • 反向遍历是 NavigableMap 的一个重要特性,方法如 descendingKeySet() 和 descendingMap() 使得反向操作变得非常简便。
  • 子集视图方法(如 subMap()、headMap()、tailMap())为我们提供了更多灵活的数据处理方式,允许我们根据特定范围来获取部分数据视图。
相关推荐
Code_Solitude9 分钟前
C语言:关于二维数组的作业总结
java·c语言·前端
专业程序开发源28 分钟前
django新闻推荐系统70655-计算机课程设计、毕业设计
java·javascript·spring boot·后端·python·django·课程设计
打工仔折腾 AI40 分钟前
把 AI Agent 托管到家里电脑:UU远程端口映射与CLI实测记录
人工智能·后端·python·langchain·电脑·ai agent 实战
acd1200943 分钟前
前端随笔:数据明明变了,Vue 页面就是不更新
前端·javascript·vue.js
vx_Biye_Design44 分钟前
springboot一站式旅游管理平台81037-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·课程设计·express·旅游
嵌入式学习菌1 小时前
ESP32 ModbusTCP 分片缓存
java·后端·spring
程序员小杰@1 小时前
Spring Boot 常用注解分类速记
java·spring boot·后端
挖掘狂人1 小时前
Git 从 0 到 1:用一个小项目走完 add / commit / reset / merge / rebase / push
git·后端·github
vx_Biye_Design1 小时前
springboot小学生英语学习APP62773-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·学习·课程设计
打工仔折腾 AI1 小时前
用UU远程把家里电脑变成AI Agent常驻服务器:CLI、端口映射与代理实测
运维·服务器·人工智能·后端·python·电脑·ai agent 实战