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

一、什么是Java 8 Stream

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

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

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

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

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

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

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

参数一:向map里面put的键

参数二:向map里面put的值

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

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

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

三、按Map的键排序

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

点击可放大

看上文中第二段代码:

首先使用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不能保证元素的顺序。

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

四、按Map的值排序

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

这是显示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,更多精品合集知识等待你!

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

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

  1. 注册表处理之(写入DWORD类型或者字符串类型的键项值)

    写入DWORD类型或者字符串类型的键项值 HKEY hKey; DWORD dw; RegOpenKeyEx(hMainKey,subKey,0,0,&hKey);//打开子键 if(1 == ...

  2. java8 lambda maplist排序_「java8系列」流式编程Stream

    前言 「Java8系列」神秘的Lambda 「Java8系列」神奇的函数式接口 继上两篇之后,本文已经java8系列的第三篇了.本篇文章比较长,但我希望大家都能认真读完.读不完可以先收藏,在找时间读. ...

  3. java reduce 分组_使用JAVA8 stream中三个参数的reduce方法对List进行分组统计

    背景 平时在编写前端代码时,习惯使用lodash来编写'野生'的JavaScript; lodash提供来一套完整的API对JS对象(Array,Object,Collection等)进行操作,这其中 ...

  4. java outputstream api,Java8 stream API以及常用方法

    Java8引入了全新的Stream API,Stream API为Java编程提供了丰富的函数式编程操作. Stream API与Java提供的其他集合类型有本质的区别,具体如下: java.io的I ...

  5. java8 stream流操作集合交集,差集,并集,过滤,分组,去重,排序,聚合等

    测试对象 public class Person {private String name;private Integer age;private Integer weight;public Pers ...

  6. java keyset entryset 顺序_「entryset」如何遍历Map,map的keySet()和EntrySet()区别 - seo实验室...

    entryset 如何遍历Map,map的keySet()和EntrySet()区别 遍历map public static void main(String[] args) { // TODO Au ...

  7. java rowmapper 通用实现_将每行映射为MAP对象的RowMapper实现

    import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import j ...

  8. java map数组定义_如何定义一个空的Map[]数组?

    Map[] apsMap = (Map[])request.getAttribute("APSMAP"):有时候我们需要从后台获取一个Map数组,并且使用他. 但是这个Map数组有 ...

  9. Java8————Stream API

    引言 Java8 加入了java.util.stream包,这个包中的相关API将极大的增强容器对象对元素的操作能力. 它专注于对集合对象进行各种便利.高效的聚合操作,或大批量数据处理. Stream ...

最新文章

  1. Oracle原理:11g中的网络配置
  2. mysql5.7.10 二进制包_MYSQL5.7二进制包的安装
  3. python生成文件夹并向文件夹写文件_python - 文件练习生成100个MAC地址写入文件
  4. Java的权限修饰符,访问范围
  5. MVC入门小示例---淘宝商品的搜索和价格筛选
  6. PHP实现完全二叉树
  7. 《Excel数据处理与分析实战技巧精粹》扫描版[PDF]
  8. 后台开发 vs App应用开发?
  9. 20个免费网站测试工具
  10. [python][project][爬虫] 堆糖网图片下载
  11. Ubuntu使用Flux调节色温保护眼睛
  12. 小白也能看懂的手机配置攻略
  13. c:\windows\ ntdetect failed
  14. PostgreSQL11 | pgadmin4基本使用
  15. 皮卡智能联手全球最大贸易服务商PingPong,共推AIGC应用落地服务
  16. Windows下PostgreSQL 8.1版安装图解
  17. 使用 Docker 来快速上手中文 Stable Diffusion 模型:太乙
  18. photoshop做带有透明通道的贴图
  19. 哈哈!12万行代码堆出来个「蔡徐坤」
  20. 短视频、直播平台——电商直播源码第三方SDK接入教程

热门文章

  1. ASP.NET Core 3.0:将会拥有更少的依赖
  2. 使用 ASP.NET Core, Entity Framework Core 和 ABP 创建N层Web应用 第二篇
  3. .NET Core 已经实现了PHP JIT,现在PHP是.NET上的一门开发语言
  4. .NetCore+Jexus代理+Redis模拟秒杀商品活动
  5. Visual Studio 2015和2017里面应该创建哪种 Class Library
  6. 理解并从头搭建redis集群
  7. Entity Framework Core 1.1 升级通告
  8. 高可用架构可行性方案
  9. Nginx—— Rewrite规则的使用
  10. 利用pdf.js开发嵌入pdf显示,以及利用jquery-ui左右分栏显示