java map 值排序_使用Java8 Stream API对Map类型按照键或值进行排序

c67bca7e3ca0b5072cd062a1e91c96f4.png

在这篇文章中,您将学习如何使用Java对Map按照键或值进行排序。前几日有位朋友面试遇到了这个问题,看似很简单的问题,但是如果不仔细研究一下也是很容易让人懵圈的面试题。所以我决定写这样一篇文章。在Java中,有多种方法可以对Map进行排序,但是我们将重点介绍Java 8 Stream,这是实现目标的一种非常优雅的方法。

一、什么是Java 8 Stream

使用Java 8 Streams,我们可以按键和按值对映射进行排序。下面是它的工作原理:

896cb5f926d6c338c32c48f2ad36de7f.png

将Map或List等集合类对象转换为Stream对象

使用Streams的sorted()方法对其进行排序

最终将其返回为LinkedHashMap(可以保留排序顺序)

sorted()方法以Comparator作为参数,从而可以按任何类型的值对Map进行排序。如果对Comparator不熟悉,可以看本号前几天的文章,有一篇文章专门介绍了使用Comparator对List进行排序。

二、学习一下HashMap的merge()函数

在学习Map排序之前,有必要讲一下HashMap的merge()函数,该函数应用场景就是当Key重复的时候,如何处理Map的元素值。这个函数有三个参数:

参数一:向map里面put的键

参数二:向map里面put的值

参数三:如果键发生重复,如何处理值。可以是一个函数,也可以写成lambda表达式。

41dad590df343b2ef3c13a661c58a576.png

看上面一段代码,我们首先创建了一个HashMap,并往里面放入了一个键值为k:1的元素。当我们调用merge函数,往map里面放入k:2键值对的时候,k键发生重复,就执行后面的lambda表达式。表达式的含义是:返回旧值oldVal加上新值newVal(1+2),现在map里面只有一项元素那就是k:3。

其实lambda表达式很简单:表示匿名函数,箭头左侧是参数,箭头右侧是函数体。函数的参数类型和返回值,由代码上下文来确定。

三、按Map的键排序

下面一个例子使用Java 8 Stream按Map的键进行排序:

ab363df0b1e575792830d6e91f695044.png

点击可放大

看上文中第二段代码:

首先使用entrySet().stream() 将Map类型转换为Stream流类型。

然后使用sorted方法排序,排序的依据是Map.Entry.comparingByKey(),也就是按照Map的键排序

最后用collect方法将Stream流转成LinkedHashMap。 其他参数都好说,重点看第三个参数,就是一个merge规则的lambda表达式,与merge方法的第三个参数的用法一致。由于本例中没有重复的key,所以新值旧值随便返回一个即可。

上面的程序将在控制台上打印以下内容,键(国家/地区名称)以自然字母顺序排序:

China=86France=33Germany=49Pakistan=92United States=1

请注意使用LinkedHashMap来存储排序的结果以保持顺序。默认情况下,Collectors.toMap()返回HashMap。HashMap不能保证元素的顺序。

如果希望按照键进行逆向排序,加入下图中红色部分代码即可。

a7cde8b6e66227eae224b11087ea7d47.png

四、按Map的值排序

当然,您也可以使用Stream API按其值对Map进行排序:

1d6b0dc692488d5464896d2c6aa8a0bf.png

这是显示Map按值排序的输出:

United States=1France=33Germany=49China=86Pakistan=92

五、使用TreeMap按键排序

大家可能都知道TreeMap内的元素是有顺序的,所以利用TreeMap排序也是可取的一种方法。您需要做的就是创建一个TreeMap对象,并将数据从HashMapput到TreeMap中,非常简单:

// 将 `HashMap` 转为 `TreeMap`Map sorted = new TreeMap(codes);

这是输出:

China=86France=33Germany=49Pakistan=92United States=1

如上所示,键(国家/地区名称)以自然字母顺序排序。

期待您的关注

通过搜-suo-查询“字母哥博客”或zimug点靠m,更多精品合集知识等待你!

本号只做持续的知识输出,希望您能关注、评论、转发!您的支持是我不竭的创作动力!让知识产生价值、让程序员改变世界!

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

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

相关文章

GDB调试多进程|多线程程序

1. 默认设置下,在调试多进程程序时GDB只会调试主进程。但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序。只需要设置follow-fork-mode(默认值:parent)和detach-on-fork&a…

Informatica bulk与normal模式的深入详解(转)

Bulk 方式进行目标数据的Load,是Informatica提供的一种高性能的Load数据方式。它利用数据库底层机制,依靠调用数据库本身提供的Utility来进行数据的加载。 使用Bulk方式 Load时,Informatica调用Utility进行Load,此方式将绕过数据库…

php学习 基础二

常用流程控制 IF语句的使用 if(判断语句) { 执行语句体 } 判断语句 :逻辑运算符号 值非0,执行语句 IF ELSE 语句使用 if(判断语句) { 执行语句体1 } else { …

沙漠上不小心挖了个洞,让这个地狱之门般的巨坑,燃烧了50年

全世界只有3.14 % 的人关注了爆炸吧知识在土库曼斯坦的卡拉库姆沙漠深处,有一个神奇的巨坑,直径约为70米,它无论白天还是黑夜,永远都在燃烧。这个坑的周围一片荒芜,坑里也没有任何明显在助燃的东西但坑内燃烧的大火近5…

不同用户同时并发测压_简单聊聊吞吐量(TPS)、QPS、并发数、响应时间(RT)概念...

1、 响应时间(RT) 响应时间是指系统对请求作出响应的时间。直观上看,这个指标与人对软件性能的主观感受是非常一致的,因为它完整地记录了整个计算机系统处理请求的时间。由于一个系统通常会提供许多功能,而不同功能的处理逻辑也千差万别&…

读《沟通的方法》

众所周知,沟通在工作和生活中是一项非常重要的技能,但很多人却用不好这项技能,最近中秋假期,看完了得到 CEO 脱不花写的《沟通的方法》,觉得很有收获。脱不花没有上过大学,能有今天的成就,超强的…

java 数组下标 变量_Java基础语法:数组

一、简介描述:数组是相同类型数据的有序集合。其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。基本特点:数组的长度是确定的。数组一旦被创建,它的大小就是不可以改变的。数组元素必须是相同类型&…

STP的初使化过程

STP初使化过程分为网桥角色(根网桥,非根网桥)的确定和端口角色(根端口,指定端口,阻塞端口)的确定,最终端口状态(稳定状态有blocking,forwarding)确定后,树就形成了。 STP端口状态的改变依赖于端口角色的改变和计时器的超时&#x…

CGRect vs CGPoint vs CGSize

l来自http://bengan.javaeye.com/blog/728457,感谢分享! ‍ ‍每个视图都使用一个边框定义其界限。这个边框指定了视图的轮廓:其位置、宽度和高度。 我们使用Core Graphics结构宋定义边框矩形。对于边框,这通常表示由原点(CGPoin…

【转】URL编码(encodeURIComponent和decodeURIComponent)

转自http://blog.jhonse.com/archives/2032.jhonse 最近在用CI框架的时候,发现一个问题,URL的GET方式链接时,如果用中文字符的话,就会出现问题,提示:链接字符不通过,于是在网上找了很多方法&…

收藏!这10部关于数学的顶级纪录片,告诉孩子数学跟枯燥不沾边!

全世界只有3.14 % 的人关注了爆炸吧知识学好数学,必须从娃娃抓起!数学是人类的高级思维活动,越往顶层走,需要的各种思维能力就越多。所以,要想孩子数学好,首先要帮他“打牢思维的地基”。怎么打&#xff1f…

不确定规划及应用代码_性能测试划分之应用领域

性能测试划分性能测试划分有很多种,测试方法也有很多种,更确切的说是由于测试方法的不同决定了测试划分的情况,但在测试过程中性能测试的划分没有绝对的界限,常用的有压力测试、负载测试和并发用户测试等。性能测试的方法主要包括…

使用SysPrep制作Windows2008系统映像

Windows2008及R2的Sysprep程序位于C:\Windows\System32\Sysprep目录下。 前几天在做实验环境的时候发现一个奇怪的问题,成员服务器加入域时,提示加入域成功,但是本地管理员组里没有Domain Admins组,而且将域帐户加入本地管理员组时…

java监听网络连接_Android RxJava 之网络链接监听示范

RxJava在stream events处理上真的是一个利器。下面的示范代码显示如何用它来监听android设备的网络连接状况,实时接收change信息。IntentFilter filter new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);AndroidObservable.fromBroadcast(this, filter)…

老师“鬼话”全曝光!哈哈哈哈哈全国的老师都这样吗?

全世界只有3.14 % 的人关注了爆炸吧知识来源:少女兔(ID:iiilass)完来源:少女兔(ID:iiilass)作者 | 兔姐,宇宙疼老婆协会VIP会员,超人气美女漫画师&#xff0c…

windows2003——IIS

IIS转载于:https://blog.51cto.com/honglingjin2011/515383

需求分析 应该先写业务还是功能_一个套路,拆解常见数据分析需求

现实与Kaggle的区别现实环境的数据分析工作和Kaggle题目之间,最大的区别在于kaggle上的问题往往非常清晰。预测类问题,你只需要把预测做的足够准确就能拿高分。但在实际的业务环境中,你做了一个很牛逼的预测模型,换回来的只是业务…

如何在 ASP.NET CORE 中获取客户端 IP ?

咨询区 eadam:在 ASP.NET 中我可以用 Request.ServerVariables["REMOTE_ADDR"] 来获取客户端IP地址,请问在 ASP.NET Core 中我该如何实现呢?回答区 CodingYourLife如果你用的是 .NET 5,可以用内部提供的扩展方法来实现获…

jQuery EasyUI API 中文文档 - 链接按钮(LinkButton)

LinkButton 链接按钮用 $.fn.linkbutton.defaults 重写了 defaults。用法示例1. <a href"#" id"btn" iconCls"icon-search">easyui</a> 1. $(#btn).linkbutton({ 2. plain:true 3. }); 4. $(#btn).linkbutton(disable); …

10张劲爆眼球的科学动图

全世界只有3.14 % 的人关注了爆炸吧知识气球遇到橙皮会是这样的蚊子是这样吸血的&#xff0c;看着就痒蚊子是这样吸血的&#xff0c;看的浑身发痒显微镜放大看蚊子的利器&#xff0c;蚊子嘴魔术沙强磁铁其实是很危险的物品&#xff0c;携带两块以上的千万要注意全自动显微注射&…