文章目录

  • 深入理解Map.Entry.comparingByValue()和Map.Entry.comparingByKey()
    • 1. 方法定义
      • comparingByKey()
      • comparingByValue()
    • 2. 基本用法
      • 2.1 使用comparingByKey()
      • 2.2 使用comparingByValue()
    • 3. 方法重载版本
      • comparingByKey(Comparator)
      • comparingByValue(Comparator)
    • 4. 高级用法示例
      • 4.1 逆序排序
      • 4.2 自定义比较逻辑
      • 4.3 链式比较
    • 5. 与Collections.max/min结合使用
    • 6. 性能考虑
    • 7. 实际应用场景
      • 7.1 统计最高分学生
      • 7.2 商品按价格排序
      • 7.3 单词频率统计
    • 8. 注意事项
    • 9. 与相关方法的比较
    • 10. 总结


深入理解Map.Entry.comparingByValue()和Map.Entry.comparingByKey()

Java 8引入的Map.Entry.comparingByValue()Map.Entry.comparingByKey()是两个非常实用的比较器工厂方法,专门用于比较Map的条目(Entry)。本文将详细解析这两个方法的用法、区别以及实际应用场景。

1. 方法定义

comparingByKey()

public static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K, V>> comparingByKey()
  • 创建一个按键的自然顺序比较Map条目的Comparator
  • 键类型K必须实现Comparable接口

comparingByValue()

public static <K, V extends Comparable<? super V>> Comparator<Map.Entry<K, V>> comparingByValue()
  • 创建一个按值的自然顺序比较Map条目的Comparator
  • 值类型V必须实现Comparable接口

2. 基本用法

2.1 使用comparingByKey()

Map<String, Integer> map = new HashMap<>();
map.put("Orange", 2);
map.put("Apple", 5);
map.put("Banana", 3);// 按键的自然顺序(字母顺序)排序
List<Map.Entry<String, Integer>> entries = new ArrayList<>(map.entrySet());
entries.sort(Map.Entry.comparingByKey());// 结果: Apple=5, Banana=3, Orange=2

2.2 使用comparingByValue()

// 按值的自然顺序(数值大小)排序
entries.sort(Map.Entry.comparingByValue());// 结果: Orange=2, Banana=3, Apple=5

3. 方法重载版本

这两个方法都有重载版本,允许传入自定义Comparator:

comparingByKey(Comparator)

public static <K, V> Comparator<Map.Entry<K, V>> comparingByKey(Comparator<? super K> cmp)

comparingByValue(Comparator)

public static <K, V> Comparator<Map.Entry<K, V>> comparingByValue(Comparator<? super V> cmp)

4. 高级用法示例

4.1 逆序排序

// 按键逆序排序
entries.sort(Map.Entry.comparingByKey(Comparator.reverseOrder()));// 结果: Orange=2, Banana=3, Apple=5// 按值逆序排序
entries.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));// 结果: Apple=5, Banana=3, Orange=2

4.2 自定义比较逻辑

// 按键长度排序
entries.sort(Map.Entry.comparingByKey(Comparator.comparing(String::length)));// 按值的绝对值排序(假设值为Integer)
Map<String, Integer> numbers = Map.of("a", -3, "b", 2, "c", -5);
numbers.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.comparingInt(Math::abs))).forEach(System.out::println);

4.3 链式比较

// 先按值比较,值相同再按键比较
Comparator<Map.Entry<String, Integer>> comparator = Map.Entry.<String, Integer>comparingByValue().thenComparing(Map.Entry.comparingByKey());entries.sort(comparator);

5. 与Collections.max/min结合使用

Map<String, Integer> map = ...;// 找出值最大的条目
Map.Entry<String, Integer> maxEntry = Collections.max(map.entrySet(), Map.Entry.comparingByValue()
);// 找出键最小的条目
Map.Entry<String, Integer> minKeyEntry = Collections.min(map.entrySet(),Map.Entry.comparingByKey()
);

6. 性能考虑

  • 这些比较器本身不执行排序,只是定义比较规则
  • 实际排序性能取决于使用的排序算法(如Collections.sort是O(n log n))
  • 对于只需要最大/最小值的情况,使用Collections.max/min更高效(O(n))

7. 实际应用场景

7.1 统计最高分学生

Map<String, Integer> studentScores = ...;
String topStudent = Collections.max(studentScores.entrySet(),Map.Entry.comparingByValue()
).getKey();

7.2 商品按价格排序

Map<String, Double> products = ...;
List<Map.Entry<String, Double>> sortedProducts = products.entrySet().stream().sorted(Map.Entry.comparingByValue()).collect(Collectors.toList());

7.3 单词频率统计

Map<String, Integer> wordFrequency = ...;
// 找出频率最高的5个单词
List<String> topWords = wordFrequency.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())).limit(5).map(Map.Entry::getKey).collect(Collectors.toList());

8. 注意事项

  1. 空值处理

    • 默认情况下,遇到null键或值会抛出NullPointerException
    • 可以使用Comparator.nullsFirst()或nullsLast()处理
    entries.sort(Map.Entry.comparingByValue(Comparator.nullsFirst(Comparator.naturalOrder())));
    
  2. 不可比较元素

    • 如果键或值没有实现Comparable且未提供Comparator,会抛出ClassCastException
  3. 不变性

    • 这些方法返回的Comparator是不可变的且线程安全的

9. 与相关方法的比较

方法特点适用场景
Map.Entry.comparingByKey()按键比较需要按键排序或查找
Map.Entry.comparingByValue()按值比较需要按值排序或查找
Comparator.comparing()通用比较需要自定义比较逻辑
Map.Entry.comparingByKey(Comparator)带自定义比较器需要特殊键比较逻辑
Map.Entry.comparingByValue(Comparator)带自定义比较器需要特殊值比较逻辑

10. 总结

Map.Entry.comparingByValue()Map.Entry.comparingByKey()是Java 8中处理Map排序和查找的利器:

  1. 代码简洁:避免了手动实现Comparator的繁琐
  2. 可读性强:方法名直接表达了比较的意图
  3. 灵活组合:可以与thenComparing等组合实现复杂比较逻辑
  4. 性能良好:与手动实现的Comparator性能相当

掌握这两个方法可以显著提高处理Map集合的效率和代码质量,特别是在需要排序或查找最大/最小元素的场景中。

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

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

相关文章

Mac下载mysql

安装 brew list --versions | grep mysql查看已安装的mysql版本brew search mysql查看支持的mysql版本brew info mysql查看mysql版本信息brew install mysql进行安装/opt/homebrew/opt/mysql/bin/mysqld --initialize-insecure --user$(whoami) --basedir$(brew --prefix mysql…

PageHelper使用说明文档

文章目录一、简介二、集成步骤三、使用方法四、注意事项五、高级用法一、简介 PageHelper 是一个开源的 MyBatis 分页插件&#xff0c;它可以帮助我们在使用 MyBatis 进行数据库操作时方便地实现分页功能。通过简单的配置和少量的代码修改&#xff0c;就可以在查询数据时实现分…

grpo nl2sql qwen3 模型强化学习训练有效果的成立条件有哪些

在使用GRPO&#xff08;强化学习算法&#xff09;对Qwen3模型在NL2SQL&#xff08;自然语言到SQL转换&#xff09;任务上进行强化学习&#xff08;RL&#xff09;训练时&#xff0c;其效果成立的核心条件可归纳为以下几个关键维度&#xff0c;这些条件相互关联&#xff0c;共同…

面向向量检索的教育QA建模:九段日本文化研究所日本语学院的Prompt策略分析(6 / 500)

面向向量检索的教育QA建模&#xff1a;九段日本文化研究所日本语学院的Prompt策略分析&#xff08;6 / 500&#xff09; 系列说明 500 所日本语言学校结构化建模实战&#xff0c;第 6 篇。每篇拆解 1 所学校在 Prompt-QA 系统中的建模策略&#xff0c;分享工程经验&#xff0c;…

墨刀原型图的原理、与UI设计图的区别及转换方法详解-卓伊凡|贝贝

墨刀原型图的原理、与UI设计图的区别及转换方法详解-卓伊凡|贝贝最近有个设计由于时间比较仓促直接用 原型做的&#xff0c;但是原型做的大家都知道是没法用的&#xff0c;以下讲解原型和ui的区别&#xff0c;其次我们下面有三种方法把墨刀的原型变成UI图。一、墨刀原型图的原理…

前端 nodejs vue2 开发环境和微信开发环境 故障终极处理

现象某个vue2旧项目 引入vue-ls 组件等组件&#xff0c;冲突失败后删除,导致开发环境 vxe-table加载失败&#xff0c;还原后还是不行。前段项目崩溃。报警sass 某个方法 Deprecated &#xff0c;之前不会处理方式_失败回退代码项目代码 删除 node_modules&#xff0c; 删除 …

【后端】.NET Core API框架搭建(9) --配置使用Log4Net日志

目录 1.添加包 2.新建公用类 3.新建配置 4.注册 4.1.类库项目设置 5.使用 在 .NET Core 项目中使用 Log4Net 做日志记录&#xff0c;具有很多优势。尽管 .NET Core 自带了 ILogger 接口&#xff08;如使用内置的 ConsoleLogger、DebugLogger 等&#xff09;&#xff0c;但…

Agent交互细节

本文参考了https://www.bilibili.com/video/BV1v9V5zSEHA/视频及原作者代码实践 本文主要实践在第3节1、MCP MCP官方地址&#xff1a;https://modelcontextprotocol.io/introduction MCP 是一个开放协议&#xff0c;它规范了应用程序向 LLM 提供上下文的方式。 架构&#xff1a…

AI+医疗!VR和MR解剖学和针灸平台,智能时代如何重塑健康未来

在智能时代&#xff0c;“AI医疗”正从精准诊断入手&#xff0c;推动医疗系统变革&#xff0c;通过个性化健康管理、智能诊疗辅助等方式重塑健康未来&#xff01;将人工智能&#xff08;AI&#xff09;与虚拟实境&#xff08;VR&#xff09;应用到中医教学&#xff0c;透过该系…

Sersync和Rsync部署

学习参考连接 以下是我在学习过程中借鉴的经验和下载资源链接&#xff0c;感谢几位大佬的帮助&#xff0c;也供各位参考。 Rsync踩坑&#xff1a; https://blog.csdn.net/XiaoXiaoYunXing/article/details/120160395 Sersync下载源 http://down.whsir.com/downloads/sersy…

Django基础(四)———模板常用过滤器

前言上篇文章给大家介绍了DTL模板的部分知识点这篇文章继续带大家深入理解Django框架中的模板过滤器一、模板常用过滤器1.add将传进来的参数添加到原来的值上面。这个过滤器会尝试将值和 参数转换成整形然后进行相加。如果转换成整形过程中失败了&#xff0c;那么会将值和参数进…

国内MCP服务器搜索引擎有哪些?MCP导航站平台推荐

在人工智能技术蓬勃发展的今天&#xff0c;AI模型与外部工具和服务的交互能力正成为推动技术进步的关键。AIbase&#xff08;<https://mcp.aibase.cn/>&#xff09;作为一个专注于MCP(Model Context Protocol&#xff0c;模型上下文协议)服务器的集合平台&#xff0c;为全…

Python中with的作用和用法

在这里我们来详细解释一下Python中非常重要的 with 语句。 我会从 “为什么需要它” 开始&#xff0c;然后讲解 “它是什么以及如何使用”&#xff0c;最后深入到 “它的工作原理” 和 “如何自定义”。1. 为什么需要 with 语句&#xff1f;(The Problem) 在编程中&#xff0c;…

缓存雪崩、缓存穿透,缓存击穿

Redis是一个完全开源免费的高性能非关系型&#xff08;NOSQL&#xff09;的key-value数据库。 Redis不可能把所有的数据都缓存起来(内存昂贵且有限)&#xff0c;所以Redis需要对数据 设置过期时间&#xff0c;并采用的是惰性删除定期删除两种策略对过期键删除。Redis对过期键的…

springmvc跨域解决方案

在Spring MVC中处理跨域请求&#xff08;CORS&#xff0c;Cross-Origin Resource Sharing&#xff09;通常涉及到配置HTTP响应头&#xff0c;以允许来自不同源的请求。Spring MVC提供了多种方式来配置CORS&#xff0c;包括全局配置和局部配置。 使用CrossOrigin注解 在控制器的…

btstack移植之安全配对(二)

3.13.3 Legacy配对首先&#xff0c;我们回复的paring response中&#xff0c;可以看到我们不支持secure connection&#xff0c;所以我们走的是legacy配对模式。图3-74 secure连接不支持然后&#xff0c;master在pairing confirm包中回复了confirm value。图3-75 master发送con…

FRP配置( CentOS 7 上安装 FRP教程 )

** 如果你们公司没有公网IP&#xff0c;但是又想实现内网穿透&#xff0c;远程调用接口&#xff0c;在家也能调用公司服务器&#xff0c;但是nkg ssl有问题&#xff0c;花生壳坑壁&#xff0c;那么FRP是你最佳的选择&#xff01;&#xff01;&#xff01;** 不过有个前提&#…

第三次mysql作业

建立库建立mydb11_syu库2.创建s表&#xff0c;创建sc表二&#xff0e;插入数据向s表插入数据2.向sc表插入数据三&#xff0e;查询1.分别查询student表和score表的所有记录2.查询student表的第2条到5条记录3.从student表中查询计算机系和英语系的学生的信息4.从student表中查询年…

不同场景下git指令的搭配

添加账号 git config --global user.name "YourName" git config --global user.email "your_emailexample.com"设置 Git 默认分支名称为 main&#xff1a; git config --global init.defaultBranch main初始化仓库&#xff1a; git init配置SSH 密钥 如果…

NLP——迁移学习

一、迁移学习的概念 1.预训练模型(Pretrained model) 定义: 简单来说别人训练好的模型。一般预训练模型具备复杂的网络模型结构&#xff1b;一般是在大量的语料下训练完成的。 2.微调(Fine-tuning) 定义:一般是对预训练语言模型&#xff0c;进行垂直领域数据的微调&#xff0c;…