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,一经查实,立即删除!

相关文章

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

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

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

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

读《沟通的方法》

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

STP的初使化过程

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

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

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

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

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

使用SysPrep制作Windows2008系统映像

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

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

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

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

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

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;携带两块以上的千万要注意全自动显微注射&…

ajax格式

2019独角兽企业重金招聘Python工程师标准>>> $.ajax({ url: "http://www.hzhuti.com", //请求的url地址 dataType: "json", //返回格式为json async: true, //请求是否异步&#xff0c;默认为异步&#xff0c;这也是ajax重要特性 data: { …

java threadsafe 注解_Java 注解详解

什么是注解Annotation 中文译过来就是注解、标释的意思&#xff0c;在 Java 中注解是一个很重要的知识点&#xff0c;但经常还是有点让新手不容易理解。而新手很难理解的主要原因是一些技术文档里的专业术语和名词不太好理解&#xff0c;比如&#xff1a;Java 注解用于为 Java …

小凡模拟器:DynamipsGUI使用问题解决方法

DynamipsGUI前身源于美国加利福尼亚一***的杰作&#xff0c;为此CISCO也是相当的不爽&#xff0c;当然这是后话了。后被小凡编写成为中国CISCO学习者&#xff0c;考CCNA、NP、IE必备的模拟软件&#xff0c;为大家省去了不少银子。 本人在使用小凡的时候碰到过一些问题&#xff…

.Net微服务实战之可观测性

前言很多次去面试&#xff0c;有经验的面试官都会问一个问题&#xff0c;你是怎么去定位日常遇到的问题&#xff1f;平常跟同行分享自己遇到的问题&#xff0c;事后他会问我&#xff0c;这种看起来毫无头绪的问题&#xff0c;你是怎么去定位解决的&#xff1f;其实我们平常不知…

“财务自由的15个阶段!说说你到哪个阶段了?”

1 穷人家的狗子早当家2 看剧的时候忘记理我家猫它就变成这样了... 3 仿佛看到了自己周末&#xff06;放假的日常。4 一颗爆米花的诞生5 说说你的财务到哪个阶段了&#xff1f;6 三个字&#xff0c;证明你是哪里人&#xff1f;不准出现地名你点的每个赞&#xff0c;我都认真当…

LiveJournal发展历程

因近期打算对公司应用架构进行调整, 其中的一些思路值得借鉴. 以下为转载内容: 一、LiveJournal发展历程 LiveJournal是99年始于校园中的项目&#xff0c;几个人出于爱好做了这样一个应用&#xff0c;以实现以下功能&#xff1a; 博客&#xff0c;论坛社会性网络&#xff0c;找…

前端快闪三:多环境灵活配置react

大前端快闪&#xff1a;package.json文件知多少&#xff1f;大前端快闪二&#xff1a;react开发模式 一键启动多个服务你已经使用Create React App[1] 脚手架搭建了React应用&#xff0c;现在该部署了。一般会使用npm run build或者yarn build构建出静态资源&#xff0c; 由web…

vSphere 4系列之六:Standard vSwitch

一、ESX网络基础 我们知道在物理环境中&#xff0c;主机是通过物理Switch连入到网络环境中的&#xff0c;与此类似&#xff0c;在vSphere虚拟环境中有vSwitch&#xff0c;虚拟机就是通过ESX主机上vSwitch来连入网络的&#xff1b;那vSwitch又是如何连入外部物理网络环境&…

学霸真的比学渣更讨女孩子欢心吗?

全世界只有3.14 % 的人关注了爆炸吧知识表白难&#xff0c;难于追女神理工男&#xff0c;难于上青天最近小天回过头去追一部剧剧里的物理学霸顾未易顶着一张撕漫脸用薛定谔方程写下浪漫情书 却被女方认为&#xff1a;炫技 难道理工男在情话这方面真就不能拥有姓名吗&#xff1f…