SortedMap、NavigableMap

SortedMap、NavigableMap

    • SortedMap
      • 获取比较器 comparator
      • 生成子视图 subMap、headMap、tailMap
      • 获取最小、最大的键 firstKey、lastKey
    • NavigableMap
      • 获取小于、小于等于、大于、大于等于指定键的且与指定键最接近的匹配项 lowerEntry、higherEntry、ceilingEntry、floorEntry、lowerKey、higherKey、ceilingKey、floorKey
      • 删除并返回最小键、最大键关联的项 pollFirstEntry、pollLastEntry
      • 倒序视图 descendingMap、descendingKeySet
      • 生成子视图 navigableKeySet、subMap、headMap、tailMap

视图:视图的底层由原 map 支持,所有对视图的修改会反映到原 map 上,反之依然。

SortedMap

获取比较器 comparator

Comparator<? super K> comparator();

返回用于决定 key 顺序的 Comparator,如果构造方法未指定 Comparator(即使用自然顺序,key 实现了 Comparable 接口),则返回 null。

public static void main(String[] args) {// 自然顺序,Integer 实现了 Comparable 接口SortedMap<Integer, Integer> treeMap1 = new TreeMap<>();System.out.println(treeMap1.comparator());// 指定了 ComparatorSortedMap<Integer, Integer> treeMap2 = new TreeMap<>(Comparator.<Integer>naturalOrder().reversed());System.out.println(treeMap2.comparator());
}
null
java.util.Collections$ReverseComparator@2f0e140b

生成子视图 subMap、headMap、tailMap

SortedMap<K,V> subMap(K fromKey, K toKey);

返回 key 范围为 [fromKey, toKey) 的左闭右开的子视图。如果尝试插入 [fromKey, toKey) 范围外的 key,会抛异常 IllegalArgumentException

SortedMap<K,V> headMap(K toKey);

返回 key 范围为 (-∞, toKey) 的子视图(严格小于 toKey),其他与 subMap 方法相同

SortedMap<K,V> tailMap(K fromKey);

返回 key 范围为 [fromKey, +∞) 的子视图(大于等于 fromKey),其他与 subMap 方法相同

public static void main(String[] args) {SortedMap<Integer, Integer> treeMap = new TreeMap<>();treeMap.put(1, 1);treeMap.put(3, 3);treeMap.put(5, 5);treeMap.put(7, 7);treeMap.put(9, 9);System.out.println("treeMap: " + treeMap);// 左闭右开SortedMap<Integer, Integer> subMap = treeMap.subMap(3, 7);System.out.println("subMap: " + subMap);// 删除范围外的不起作用,不会抛异常subMap.remove(1);System.out.println();System.out.println("删除范围外的不起作用,不会抛异常");System.out.println("treeMap: " + treeMap);System.out.println("subMap: " + subMap);subMap.remove(3);System.out.println();System.out.println("treeMap: " + treeMap);System.out.println("subMap: " + subMap);subMap.put(4, 4);System.out.println();System.out.println("treeMap: " + treeMap);System.out.println("subMap: " + subMap);// 插入范围外的会抛异常subMap.put(7, 7);
}
treeMap: {1=1, 3=3, 5=5, 7=7, 9=9}
subMap: {3=3, 5=5}删除范围外的不起作用,不会抛异常
treeMap: {1=1, 3=3, 5=5, 7=7, 9=9}
subMap: {3=3, 5=5}treeMap: {1=1, 5=5, 7=7, 9=9}
subMap: {5=5}treeMap: {1=1, 4=4, 5=5, 7=7, 9=9}
subMap: {4=4, 5=5}
Exception in thread "main" java.lang.IllegalArgumentException: key out of rangeat java.util.TreeMap$NavigableSubMap.put(TreeMap.java:1516)at com.example.jdk8.map.T2.main(T2.java:37)

获取最小、最大的键 firstKey、lastKey

// 获取最小(第一个)的键
K firstKey()// 获取最大(最后一个)的键
K lastKey();
public static void main(String[] args) {SortedMap<Integer, Integer> treeMap = new TreeMap<>();treeMap.put(1, 1);treeMap.put(3, 3);treeMap.put(5, 5);treeMap.put(7, 7);treeMap.put(9, 9);System.out.println("treeMap: " + treeMap);System.out.println("firstKey: " + treeMap.firstKey());System.out.println("lastKey: " + treeMap.lastKey());
}
treeMap: {1=1, 3=3, 5=5, 7=7, 9=9}
firstKey: 1
lastKey: 9

NavigableMap

NavigableMap 继承了 SortedMap

public interface NavigableMap<K,V> extends SortedMap<K,V>

获取小于、小于等于、大于、大于等于指定键的且与指定键最接近的匹配项 lowerEntry、higherEntry、ceilingEntry、floorEntry、lowerKey、higherKey、ceilingKey、floorKey

获取符合条件且与指定键最接近的匹配项,没有则返回 null。换句话说就是获取符合条件的第一个匹配项。

// 返回 Entry
// 返回第一个小于 key 的 Entry
Map.Entry<K,V> lowerEntry(K key);
// 大于
Map.Entry<K,V> higherEntry(K key);
// 小于等于
Map.Entry<K,V> floorEntry(K key);
// 大于等于
Map.Entry<K,V> ceilingEntry(K key);// 只返回 key
// 小于
K lowerKey(K key);
// 大于
K higherKey(K key);
// 小于等于
K floorKey(K key);
// 大于等于
K ceilingKey(K key);
public static void main(String[] args) {NavigableMap<Integer, Integer> treeMap = new TreeMap<>();treeMap.put(1, 1);treeMap.put(3, 3);treeMap.put(5, 5);treeMap.put(7, 7);treeMap.put(9, 9);System.out.println("treeMap: " + treeMap);System.out.println("lowerEntry(5): " + treeMap.lowerEntry(5));System.out.println("lowerKey(5): " + treeMap.lowerKey(5));System.out.println("higherEntry(5): " + treeMap.higherEntry(5));System.out.println("higherKey(5): " + treeMap.higherKey(5));System.out.println("floorEntry(5): " + treeMap.floorEntry(5));System.out.println("floorKey(5): " + treeMap.floorKey(5));System.out.println("floorEntry(4): " + treeMap.floorEntry(4));System.out.println("floorKey(4): " + treeMap.floorKey(4));System.out.println("ceilingEntry(5): " + treeMap.ceilingEntry(5));System.out.println("ceilingKey(5): " + treeMap.ceilingKey(5));System.out.println("ceilingEntry(6): " + treeMap.ceilingEntry(6));System.out.println("ceilingKey(6): " + treeMap.ceilingKey(6));
}
treeMap: {1=1, 3=3, 5=5, 7=7, 9=9}
lowerEntry(5): 3=3
lowerKey(5): 3
higherEntry(5): 7=7
higherKey(5): 7
floorEntry(5): 5=5
floorKey(5): 5
floorEntry(4): 3=3
floorKey(4): 3
ceilingEntry(5): 5=5
ceilingKey(5): 5
ceilingEntry(6): 7=7
ceilingKey(6): 7

删除并返回最小键、最大键关联的项 pollFirstEntry、pollLastEntry

// 删除并返回最小键关联的项
Map.Entry<K,V> pollFirstEntry();
// 删除并返回最大键关联的项
Map.Entry<K,V> pollLastEntry();
public static void main(String[] args) {NavigableMap<Integer, Integer> treeMap = new TreeMap<>();treeMap.put(1, 1);treeMap.put(3, 3);treeMap.put(5, 5);treeMap.put(7, 7);treeMap.put(9, 9);System.out.println("treeMap: " + treeMap);System.out.println("pollFirstEntry(): " + treeMap.pollFirstEntry());System.out.println("treeMap: " + treeMap);System.out.println("pollLastEntry(): " + treeMap.pollLastEntry());System.out.println("treeMap: " + treeMap);
}
treeMap: {1=1, 3=3, 5=5, 7=7, 9=9}
pollFirstEntry(): 1=1
treeMap: {3=3, 5=5, 7=7, 9=9}
pollLastEntry(): 9=9
treeMap: {3=3, 5=5, 7=7}

倒序视图 descendingMap、descendingKeySet

// 返回与原 map 顺序相反的 NavigableMap
NavigableMap<K,V> descendingMap();
// 返回与原 map 顺序相反的 NavigableSet
NavigableSet<K> descendingKeySet();
public static void main(String[] args) {NavigableMap<Integer, Integer> treeMap = new TreeMap<>();treeMap.put(1, 1);treeMap.put(3, 3);treeMap.put(5, 5);treeMap.put(7, 7);treeMap.put(9, 9);System.out.println("treeMap: " + treeMap);NavigableMap<Integer, Integer> descendingMap = treeMap.descendingMap();System.out.println("descendingMap: " + descendingMap);NavigableSet<Integer> descendingKeySet = treeMap.descendingKeySet();System.out.println("descendingKeySet: " + descendingKeySet);
}
treeMap: {1=1, 3=3, 5=5, 7=7, 9=9}
descendingMap: {9=9, 7=7, 5=5, 3=3, 1=1}
descendingKeySet: [9, 7, 5, 3, 1]

生成子视图 navigableKeySet、subMap、headMap、tailMap

// 返回只包含 key 的视图
NavigableSet<K> navigableKeySet();
// 与 SortedMap 的 subMap、headMap、tailMap 相似,只是添加了 fromInclusive、toInclusive 用于控制是否包含边界
NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive,K toKey,   boolean toInclusive);NavigableMap<K,V> headMap(K toKey, boolean inclusive);NavigableMap<K,V> tailMap(K fromKey, boolean inclusive);
public static void main(String[] args) {NavigableMap<Integer, Integer> treeMap = new TreeMap<>();treeMap.put(1, 1);treeMap.put(3, 3);treeMap.put(5, 5);treeMap.put(7, 7);treeMap.put(9, 9);System.out.println("treeMap: " + treeMap);NavigableSet<Integer> navigableKeySet = treeMap.navigableKeySet();System.out.println("navigableKeySet: " + navigableKeySet);System.out.println("subMap(3, true, 7, true): " + treeMap.subMap(3, true, 7, true));System.out.println("subMap(3, false, 7, false): " + treeMap.subMap(3, false, 7, false));System.out.println("headMap(3, true): " + treeMap.headMap(3, true));System.out.println("headMap(3, false): " + treeMap.headMap(3, false));System.out.println("tailMap(7, true): " + treeMap.tailMap(7, true));System.out.println("tailMap(7, false): " + treeMap.tailMap(7, false));
}
treeMap: {1=1, 3=3, 5=5, 7=7, 9=9}
navigableKeySet: [1, 3, 5, 7, 9]
subMap(3, true, 7, true): {3=3, 5=5, 7=7}
subMap(3, false, 7, false): {5=5}
headMap(3, true): {1=1, 3=3}
headMap(3, false): {1=1}
tailMap(7, true): {7=7, 9=9}
tailMap(7, false): {9=9}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/593642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端及其优雅的去重方式

核心思路&#xff1a;将一个值的的类型值作为key 代码如下&#xff1a; let obj{} return arr.filter(item > {return obj.hasOwnProperty(typeof item item) ?false : (obj[typeof item item] true)}) arr就是需要筛选的数据 相较于new Set()方法&#xff0c;能区分…

SpringBoot 集成支付宝支付

网页操作步骤 1.进入支付宝开发平台—沙箱环境 使用开发者账号登录开放平台控制平台 2.点击沙箱进入沙箱环境 说明&#xff1a;沙箱环境支持的产品&#xff0c;可以在沙箱控制台 沙箱应用 > 产品列表 中查看。 3.进入沙箱&#xff0c;配置接口加签方式 在沙箱进行调试前…

rime中州韵小狼毫 inputShow lua Translator 输入字符透传翻译器

在 rime中州韵小狼毫 help lua Translator 中我们分享了如何使用 lua 脚本定义一个 translator&#xff0c;并以 五笔・拼音 为例引用了该 translator&#xff0c;并且达到了预期的效果。 今天&#xff0c;我们继续通过 lua 脚本为 rime中州韵/小狼毫 输入法打造一个 translat…

实验3 vTPM相关

可以代做实验手册等私聊 一、实验目的 1.了解vTPM原理和相关知识&#xff1b;2.创建具备vTPM的虚拟机&#xff1b;3.加深对可信计算技术的理解。 二、实验内容 安装seabios&#xff0c;libtpms&#xff0c;swtpm&#xff0c;qemu‐tpm&#xff1b;启动vTPM&#xff1b;安装…

守正出奇,穿越周期 - Bytebase 的 2023

前情提要&#xff1a;Bytebase 的 2022&#xff5c;埋头苦干&#xff0c;孕育希望 产品迭代 2023 年共发布了 25 个版本。这个数字和 2022 年一样&#xff0c;除开春节和一次全员疫情&#xff0c;做到了两周一次的更新。 版本号从 1.11.0 升级到了 2.13.0。其中在 5 月份&…

基于ExoPlayer的缓存方案实现

音视频APP 的一个必备功能就是在播放的时候会持续缓存完整个音频,同时进度条会更新缓存进度。但是目前Google推出的播放器ExoPlayer本身并没有提供什么方便的接口去实现这个功能,因此大多数的开发者可能会使用AndroidVideoCache 开源库来实现缓存。 AndroidVideoCache 的原理…

MySQL常见面试题总结

1.MySQL基础 1.1什么是关系型数据库&#xff1f; 顾名思义&#xff0c;关系型数据库&#xff08;RDB&#xff0c;Relational Database&#xff09;就是一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系&#xff08;一对一、一对多、多对多…

图像分割-漫水填充法 floodFill

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 本文的C#版本请访问&#xff1a;图像分割-漫水填充法 floodFill (C#&#xff09;-CSDN博客 FloodFill方法是一种图像处理算法&#…

自定义Redis配置以优化你的Spring应用

在开发Spring应用时&#xff0c;Redis作为一个高效且功能丰富的内存数据存储&#xff0c;经常被用作缓存层来加速应用的响应速度。Spring Boot提供了与Redis集成的便捷方式&#xff0c;但有时默认的配置可能不满足我们的特定需求。这时&#xff0c;自定义Redis配置就显得尤为重…

kotlin 中 any, all , none

any 如果至少有一个元素匹配给定谓词&#xff0c;那么 any() 返回 true。 all 如果没有元素与给定谓词匹配&#xff0c;那么 none() 返回 true。 none 如果所有元素都匹配给定谓词&#xff0c;那么 all() 返回 true。 请注意&#xff0c;在一个空集合上使用任何有效的谓词去…

JAVA设计小分队02

import java.util.Objects;/*** description: 学生类* author: sfj* Email&#xff1a;2238414084qq.com* create: 2023-12-18 20:15**/ public class Student implements Comparable<Student> {private int sno;private String name;private int age;private int math;p…

C++上位软件通过Snap7开源库访问西门子S7-200/合信M226ES数据块的方法

前言 上一篇文章中介绍了Snap7访问西门子S7-1200/S7-1500 DB块的方法&#xff0c;对于S7-200PLC是没有数据块访问的。S7-200PLC中Snap7只能通过访问MB块&#xff0c;VB块的方法进行和PLC之间的Snap7通信和数据交换。手头没有S7-200PLC故通过合信CTMC M226ES运动控制器进行测试&…

SSM的校园二手交易平台----计算机毕业设计

项目介绍 本次设计的是一个校园二手交易平台&#xff08;C2C&#xff09;&#xff0c;C2C指个人与个人之间的电子商务&#xff0c;买家可以查看所有卖家发布的商品&#xff0c;并且根据分类进行商品过滤&#xff0c;也可以根据站内搜索引擎进行商品的查询&#xff0c;并且与卖…

如何用js动态修改字体大小

在项目中&#xff0c;我们常常会遇到使用v-html渲染文本的情况。 如果需要点击大中小三个字号按钮&#xff0c;需要修改字体的大小。那我们应该怎么做呢 function fontSize(element, type) {let size {big: 22,middle: 16,small: 12};var result element.innerHTML.replac…

hAdmin漂亮的后台html模板免费下载

hAdmin漂亮的后台html模板免费下载-遇见你与你分享

Linux awk命令教程:如何有效处理文本和数据分析(附案例详解和注意事项)

Linux awk命令介绍 awk是一个强大的文本分析工具&#xff0c;其本质上是一个数据驱动式的脚本语言&#xff0c;用于处理文本&#xff0c;并对文本进行诸如生成报告等各种操作。这是一个强大的Linux命令行程序&#xff0c;用于处理和分析文本文件&#xff0c;特别是那些对文本格…

232.用栈实现队列

我的解法 class MyQueue {Stack<Integer> stackIn;Stack<Integer> stackOut;public MyQueue() {stackIn new Stack<>();// 负责进栈stackOut new Stack<>();// 负责出栈}public void push(int x) {// 把出栈元素全部放到进栈while (!stackOut.empty…

autograd与逻辑回归

一、autograd—自动求导系统 torch.autograd.backward() torch.autograd.backward()是PyTorch中用于计算梯度的函数。以下是对该函数的参数的解释&#xff1a; 功能&#xff1a;自动求取梯度 • tensors: 用于求导的张量&#xff0c;如 loss • retain_graph : 保存计算图 •…

生物生态学领域构建和分析进化树的常用R工具包介绍和使用

构建进化树的需求 在生物生态学领域&#xff0c;构建进化树&#xff08;也称为系统发生树或谱系树&#xff09;具有以下几个重要的目的和需求&#xff1a; 理解物种间的亲缘关系&#xff1a; 进化树揭示了物种之间的演化关系和共同祖先&#xff0c;帮助科学家理解不同物种是如…

【Linux】基本指令了解(一)

&#x1f497;个人主页&#x1f497; ⭐个人专栏——数据结构学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读&#xff1a;1. 认识Linux1.1 什么是Linux1.2 Linux特点 2. ls指令3. pwd命令4. cd 指令5. touch命令6. mkdir指令7. …