当前位置: 首页 > news >正文

Java 集合 - 用好 SortedMap 和 NavigableMap,优化 Java 集合排序与操作效率

Java中,SortedMapNavigableMap接口为Map提供了对键排序的功能。这些接口有助于管理那些需要有序存储和按特定顺序访问键值对的情况。它们通过TreeMap类的实现来工作,TreeMap是一种自平衡的红黑树数据结构,它保证了键的顺序。

SortedMapMap接口的扩展,而NavigableMapSortedMap的一个进一步扩展。这两个接口的实现都可以使用TreeMap类。它们都能确保键值对按照键进行排序。

SortedMapNavigableMap的功能

SortedMapNavigableMap接口通过键值对的排序,为Map提供了额外的功能。下面是它们的一些重要方法和使用方法。

方法概述

SortedMap接口通过以下方法扩展了Map

  1. firstKey()lastKey():返回Map中最小和最大键。
  2. headMap(toKey):返回一个新的SortedMap,其键小于toKey
  3. tailMap(fromKey):返回一个新的SortedMap,其键大于或等于fromKey
  4. subMap(fromKey, toKey):返回一个新的SortedMap,其键大于或等于fromKey,且小于toKey

这些方法返回的SortedMap是原始Map的视图,任何对这些视图的更改都会反映在原始Map中。值得注意的是,这些视图不能插入超出原始Map范围的键。

NavigableMap的附加功能

NavigableMap接口提供了更多的功能,包括方法navigableKeySet(),它返回一个NavigableSet,而不是普通的keySet()NavigableSet提供了更多的操作,例如返回下一个和上一个键。

示例:SortedMap的使用

让我们通过一个例子来看看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"); // 获取最小键和最大键 System.out.println("First Key: " + map.firstKey()); // 输出 1 System.out.println("Last Key: " + map.lastKey()); // 输出 6 // 获取键小于3的部分 SortedMap<Integer, String> headMap = map.headMap(3); headMap.forEach((key, value) -> System.out.println(key + " :: " + value)); // 获取键大于或等于3的部分 SortedMap<Integer, String> tailMap = map.tailMap(3); tailMap.forEach((key, value) -> System.out.println(key + " :: " + value)); // 获取键在3到5之间的部分 SortedMap<Integer, String> subMap = map.subMap(3, 6); subMap.forEach((key, value) -> System.out.println(key + " :: " + value));

运行结果:

First Key: 1 Last Key: 6 1 :: one 2 :: two 3 :: three 3 :: three 5 :: five 6 :: six 3 :: three 4 :: four 5 :: five

错误处理示例

SortedMapNavigableMap返回的视图在修改时有一些限制。比如,我们通过headMap()方法创建了一个视图,并试图向这个视图插入一个不在范围内的键,这会导致IllegalArgumentException异常。

SortedMap<Integer, String> headMap = map.headMap(3); headMap.put(0, "zero"); // 这个是合法的,因为 0 < 3 headMap.put(4, "four"); // 这个会抛出 IllegalArgumentException 异常,因为 4 不在 headMap 范围内

解释:

  • headMap(3)返回一个只包含小于3的键的SortedMap视图。因此,向该视图插入键值对(4, "four")会抛出异常,因为4超出了headMap的键范围。
  • 但插入(0, "zero")是合法的,因为0小于3。

通过Comparator控制排序

SortedSetNavigableSet类似,SortedMapNavigableMap的键必须实现Comparable,或者你可以在创建TreeMap时提供一个Comparator,来决定键的排序方式。如果提供了Comparator,即使键实现了ComparableComparator也会被优先使用。

TreeMap<Integer, String> map = new TreeMap<>(Comparator.reverseOrder()); map.put(1, "one"); map.put(2, "two"); map.put(3, "three"); map.forEach((key, value) -> System.out.println(key + " :: " + value));

运行结果:

3 :: three 2 :: two 1 :: one

总结

  • SortedMapNavigableMap提供了对键排序的强大支持,能够按顺序查询键,并对部分键集合进行操作。
  • 通过headMap(),tailMap(),subMap()等方法,你可以方便地获取按顺序划分的Map视图,并对这些视图进行修改。
  • NavigableMap提供了更多的方法,例如navigableKeySet(),让你可以获得更多基于顺序操作的功能。
  • 在使用视图时要注意,不可以插入不在视图范围内的键。

通过这些方法和特性,SortedMapNavigableMap能够帮助你更高效地处理排序和部分视图的需求,是构建有序Map数据结构的理想选择。

http://www.jsqmd.com/news/1068052/

相关文章:

  • 后端常见问题
  • 继电器项目
  • RAG 系统化学习教程(含查询改写、混合检索、重排序、上下文增强与评估闭环)
  • 2026山东大学软件学院项目实训-宠物情绪识别(七)
  • 震动感应灯
  • Kimi LeetCode 3343. 统计平衡排列的数目 Java实现
  • 手把手教你学Simulink——基于单周期控制(One‑Cycle Control, OCC)的无桥 PFC 整流器仿真
  • 告别重复操作!OpenClaw 2.7.9 电脑自动化完整落地实操
  • 3PEAK思瑞浦 TPA8101-SOAR WSOP8 隔离放大器和调制器
  • 鸿蒙 NDK开发:使用命令行CMake构建工程(三)
  • Windows系统文件FM20.DLL丢失找不到问题解决
  • 为什么你越讨好别人,越没人把你当回事?
  • 腾讯犀牛鸟开源计划启动!一行命令部署 OpenTenBase,速通 issue 拿面试绿通
  • 监督学习与无监督学习是什么?关键区别在有没有答案
  • 【HarmonyOS 6】仿AI唤起屏幕边缘流光特效
  • 基于 Harmony 6.0 应用的车辆保养提醒管家实现
  • Shell脚本为何成为AI智能体视觉(TVA)的“反射弧”(7)
  • 衍射-全息混合架构:实现被动光学实时图像分类的光子AI系统
  • 卫星联邦学习CroSatFL:跨聚合机制如何破解星上智能节能难题
  • 智能合约库验证:上下文合约与模块化架构的测试策略对比
  • 软件质量控制中的统计过程控制
  • LLM运行机制
  • 学习创建支持演示公式的复杂表格|《经济学人》杂志巨无霸指数的可视化图表代码
  • 化学结构识别:为何OCSR视觉技术优于纯文本JSON解析?
  • π0.7项目解析:跨机器人零样本迁移与高效推理的具身智能新范式
  • 专利代理师:2025年专利代理师资格考试《实务》模拟真题及答案
  • 大语言模型推理优化:从思维链到潜在状态轨迹的范式跃迁
  • AI+仿真构建交互式电力工程教学框架:从原理到实践
  • 多集群管理
  • 51单片机音乐盒