当前位置: 首页 > 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.gsyq.cn/news/1580003.html

相关文章:

  • 震动感应灯
  • RAG 系统化学习教程(含查询改写、混合检索、重排序、上下文增强与评估闭环)
  • 告别重复操作!OpenClaw 2.7.9 电脑自动化完整落地实操
  • 腾讯犀牛鸟开源计划启动!一行命令部署 OpenTenBase,速通 issue 拿面试绿通
  • LLM运行机制
  • AI+仿真构建交互式电力工程教学框架:从原理到实践
  • 大语言模型推理优化:从思维链到潜在状态轨迹的范式跃迁
  • 多集群管理
  • 51单片机音乐盒
  • 线性合约与标准合约选择及支付机制优化实战指南
  • MATRIX框架:基于双通道约束奇偶校验的多层代码水印技术实践
  • 接口幂等性设计与实现
  • 联邦学习在3D物体检测中的应用:Fed3D框架解析与实践
  • 动态列生成在双目标切割问题中的优化应用
  • 成都工装市场,现在到底是啥格局?说点实在的
  • Go语言的race检测器与数据竞争在并发程序中的重现方法
  • 2026 年命理研究工具的功能和配套内容,会不会买了之后就不再更新了?第三方学习路径观察
  • 数字劳动力定价机制解析:从算法压价到垂直集体行动的价值重塑
  • NaijaS2ST:构建低资源尼日利亚语言多口音语音翻译基准
  • DEMUX框架:解密混合加密流量下的多标签网站指纹攻击
  • 大模型推理优化:Tilted Sampling与Beam Search解码策略对比分析
  • 【Claude】OAuth token revoked / Org not allowed 错误的认证链路排查 bug报错已解决
  • hp-鲁棒内罚间断Galerkin方法求解p-Laplacian方程:原理、实现与自适应策略
  • LP2DH:基于局部保持像素差分哈希的动态纹理识别实战解析
  • 基于Reddit历时词嵌入的语义演变追踪:从数据获取到可视化分析
  • VoodooNet:基于高维随机投影与伪逆解析的神经网络瞬时训练技术
  • SecureRouter框架:融合MPC与智能路由实现Transformer安全高效推理
  • RISE方法解析:基于注意力机制的大模型训练数据估值与归因实践
  • Ubuntu 22.04下PostgreSQL静态加密实战:LUKS2全盘加密方案
  • 量子计算优化:常数深度电路高效制备Dicke态的原理与实践