Java基础之Map集合排序
一、概述
在我们实际的开发环境中,我们经常需要对Map集合按照键或者值进行排序,有时需要升序,有时又需要降序,为此笔者将自己平常使用的常见排序方法列出,以供大家参考,如有说的不对之处还望各位看官多多指教;
二、使用
1、按键排序
首先来说按照键排序,一般来说,解决该问题的思路可以归纳为以下几种:
① 将Map集合转成TreeMap集合实现排序,可降序、升序,如下方法ordnarySortByTreeMap所示;
② 将Map集合转化成对应的Set集合,List集合,遍历List集合,最后将所有排序后的元素填充到一个新的Map集合中,例如以下方法ordnarySortByKey所示;
③ 将Map集合转化成Set集合。利用jdk8中的Stream进行排序,可利用Map.Entry中的排序器进行排序,具体操作如方法newSortByKey所示,该方法与其他的方法相比,最大的亮点就是优雅且可以支持多种排序功能;
/*** @describtion: 按照键的普通排序* @author: Sundz* @date: 2020/1/2 22:15* @param: [paramMap, isdesc] 入参集合 指定升序、降序* @return: java.util.Map<java.lang.String ,java.lang.Integer>*/public static Map<String, Integer> ordnarySortByKey(Map<String, Integer> paramMap, boolean isdesc) {Preconditions.checkNotNull(paramMap);Set<Map.Entry<String, Integer>> sortedSet = paramMap.entrySet();Preconditions.checkNotNull(sortedSet);Map<String, Integer> resMap = new LinkedHashMap<>(paramMap.size());List<Map.Entry<String, Integer>> sortedList = Lists.newArrayList(sortedSet);//实现比较器Comparator<Map.Entry<String, Integer>> comparator = new Comparator<Map.Entry<String, Integer>>() {@Overridepublic int compare(Map.Entry<String, Integer> entry1, Map.Entry<String, Integer> entry2) {//也可采用entry2比较entry1进行降序排序return entry1.getKey().compareTo(entry2.getKey());}};//降序 output:{dbc=9, cba=5, bca=16, abc=15}if (isdesc) {Collections.sort(sortedList, Collections.reverseOrder(comparator));} else {//升序 output:{abc=15, bca=16, cba=5, dbc=9}Collections.sort(sortedList, comparator);}for (Map.Entry<String, Integer> entry : sortedList) {String key = entry.getKey();Integer value = entry.getValue();if (StringUtils.isAnyBlank(key, String.valueOf(value))) {continue;}resMap.put(key, value);}return resMap;}/*** @describtion: 采用TreeMap的形式进行排序,默认升序* @author: Sundz* @date: 2020/1/2 22:25* @param: [paramMap]* @return: java.util.Map<java.lang.String,java.lang.Integer>*/public static Map<String, Integer> ordnarySortByTreeMap(Map<String, Integer> paramMap) {Preconditions.checkNotNull(paramMap);//此处需要将非TreeMap转化成TreeMap,可采用for循环遍历的方式,然后put,但是今天我们玩点新花样//output:{abc=15, bca=16, cba=5, dbc=9}return paramMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> x, TreeMap::new));}/*** @describtion: 优雅实现排序,jdk8的新语法,最后的转化集合必须是LinkedHashMap,这样才能保持插入的顺序* @author: Sundz* @date: 2020/1/2 22:28* @param: [paramMap, isdesc]* @return: java.util.Map<java.lang.String ,java.lang.Integer>*/public static Map<String, Integer> newSortByKey(Map<String, Integer> paramMap, boolean isdesc) {Preconditions.checkNotNull(paramMap);if (isdesc) { // output:{dbc=9, cba=5, bca=16, abc=15}//jdk8 中Map.Entry接口支持多种排序,可按键,按值、颠倒及多个比较器组合等形式进行排序return paramMap.entrySet().stream().sorted(Map.Entry.<String, Integer>comparingByKey().reversed()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> x, LinkedHashMap::new));} else {//output:{abc=15, bca=16, cba=5, dbc=9}return paramMap.entrySet().stream().sorted(Map.Entry.comparingByKey()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> x, LinkedHashMap::new));}}
2、按值排序
按照Map集合的值进行排序,也是我们经常遇到的场景,为此笔者也做了一个简单的总结,按照值进行排序可以从几个角度进行思考:
① 可采用将其转化成对应的Set集合进行排序,然后将添加至对应的Map集合,从而实现排序,如方法ordnarySortByValue所示;
② 将集合转化成Set集合,采用流的形式进行排序,最后收集成Map集合;
/*** @describtion: 按照值进行排序* @author: Sundz* @date: 2020/1/3 21:29* @param: [paramMap, isDesc] //{bca=16, cba=5, abc=15, dbc=9}* @return: java.util.Map<java.lang.String,java.lang.Integer>*/public static Map<String, Integer> ordnarySortByValue(Map<String, Integer> paramMap, boolean isDesc) {Objects.requireNonNull(paramMap);Comparator<Map.Entry<String, Integer>> comparator = Comparator.comparing(Map.Entry::getValue);Set<Map.Entry<String, Integer>> sortedSet = null;if (isDesc) { //output:{bca=16, abc=15, dbc=9, cba=5}sortedSet = FluentIterable.from(paramMap.entrySet()).toSortedSet(comparator);} else { //output:{cba=5, dbc=9, abc=15, bca=16}sortedSet = FluentIterable.from(paramMap.entrySet()).toSortedSet(Collections.reverseOrder(comparator));}Map<String, Integer> resMap = new LinkedHashMap<>(paramMap.size());for (Map.Entry<String, Integer> entry : sortedSet) {String key = entry.getKey();Integer value = entry.getValue();if (!StringUtils.isAnyBlank(key, String.valueOf(value))) {resMap.put(key, value);}}return resMap;}/*** @describtion: 采用Stream的形式进行排序且转化成Map集合* @author: Sundz* @date: 2020/1/3 21:37* @param: [paramMap, isDesc]* @return: java.util.Map<java.lang.String,java.lang.Integer>*/public static Map<String, Integer> newSortedByValue(Map<String, Integer> paramMap, boolean isDesc) {Objects.requireNonNull(paramMap);if (isDesc) {return paramMap.entrySet().stream().sorted(Map.Entry.<String, Integer>comparingByValue().reversed()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> x, LinkedHashMap::new));} else {return paramMap.entrySet().stream().sorted(Map.Entry.comparingByValue()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> x, LinkedHashMap::new));}}
三、结束语
赠人玫瑰,手有余香,请留下您的宝贵建议或者赞吧!
Java基础之Map集合排序相关推荐
- 【Java基础篇】集合排序
所谓集合排序是指对集合内的元素进行排序. 集合工具类Collections中提供了两种排序算法,分别是: Collections.sort(List list) Collections.sort(Li ...
- Java基础之Map集合
Map集合: 1.Map集合与Collection集合的区别: 1.Collection中的集合,元素是孤立存在的,向集合中存储元素采用一个个元素的方式存储. 2.Map中的集合1,元素是成对存在的, ...
- Java基础程序——Set集合排序(四种写法)
对ArrayList集合中的6个学生对象进行去重并按照年龄从小到大的顺序排序 Set的特性是有序不重复,使用集合去重 对Set中的年龄属性进行比较 public class Demos {public ...
- Java 基础面试之集合
Java 基础面试之集合 1.Collection接口 的实现类 答:Collection接口有3个子接口:List.Set.Queue a.List(有序.可重复):的实现类有ArrayList.V ...
- java8新特性:对map集合排序
一.简单介绍Map 在讲解Map排序之前,我们先来稍微了解下map,map是键值对的集合接口,它的实现类主要包括:HashMap, TreeMap, Hashtable以及LinkedHashMap等 ...
- java8新特性:对map集合排序,根据key或者value操作排序(升序、降序)
java8新特性:对map集合排序,根据key或者value操作排序(升序.降序) 直接上代码: package com.drew.test; import java.util.List; impor ...
- Java中遍历Map集合的5种方式总结
这篇文章主要给大家介绍了关于Java中遍历Map集合的5种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值. 方式一 通过Map.keySet使用iterator遍历 ...
- java基础入门-04-【集合学生管理系统】
Java基础入门-04-[集合&学生管理系统] 11.集合&学生管理系统 11.1.ArrayList 集合和数组的优势对比: 11.1.1 ArrayList类概述 11.1.2 A ...
- JAVA中的Map集合
JAVA中的Map集合 1.Map简介 java.util.map接口 1.Map称为查找表,该数据结构的样子是一个"多行两列"的表格,左列为key,右列为value,Map总是根 ...
- 【Java基础·Comparator多字段排序】
[Java基础·Comparator多字段排序] 需求 对指定List按照 身份证号.姓名.入学时间倒序排列 版本1 package com.biaogexf.tools;import lombok. ...
最新文章
- 【numpy】协方差计算
- 做业务与技术之间的桥梁
- 跳转路径时资源路径加/和不加/的区别
- Java 关于File使用
- 3分钟学会python_3分钟学会一个Python小技巧
- drools。drools_使用Drools跟踪输出
- 第17章:图像分割提取
- html一行省略号变手型,鼠标移动到表格的TD上的时候显示成一个手型的样子怎么做?...
- Windows Server 2012学习
- 中考可以使用计算机吗,中考报志愿必须用电脑吗
- ES8新特性_async和await结合发送ajax请求---JavaScript_ECMAScript_ES6-ES11新特性工作笔记051
- Intel发6款全新9代i9/i7/i5 CPU:巅峰8核
- 基于Swoole和beanstalkd实现多进程处理消息队列。
- dotween路径移动_使用DOTween Pro插件设置物体移动的位置、移动的方式、以及动画结束时执行方法...
- kubernetes视频教程笔记 (23)-存储-Volume
- win7卡在正在启动windows界面_Windows系统电脑卡在开机界面进不去系统解决方法
- 3D打印Gcode文件命令详解
- 申论文章观点的打造技巧
- Oracle OAF 学习小结(1)- 个性化详解
- 全国卖菜大爷将大面积失业,社区团购夺走卖菜商贩生计,真的会出问题吗