一、概述

在我们实际的开发环境中,我们经常需要对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集合排序相关推荐

  1. 【Java基础篇】集合排序

    所谓集合排序是指对集合内的元素进行排序. 集合工具类Collections中提供了两种排序算法,分别是: Collections.sort(List list) Collections.sort(Li ...

  2. Java基础之Map集合

    Map集合: 1.Map集合与Collection集合的区别: 1.Collection中的集合,元素是孤立存在的,向集合中存储元素采用一个个元素的方式存储. 2.Map中的集合1,元素是成对存在的, ...

  3. Java基础程序——Set集合排序(四种写法)

    对ArrayList集合中的6个学生对象进行去重并按照年龄从小到大的顺序排序 Set的特性是有序不重复,使用集合去重 对Set中的年龄属性进行比较 public class Demos {public ...

  4. Java 基础面试之集合

    Java 基础面试之集合 1.Collection接口 的实现类 答:Collection接口有3个子接口:List.Set.Queue a.List(有序.可重复):的实现类有ArrayList.V ...

  5. java8新特性:对map集合排序

    一.简单介绍Map 在讲解Map排序之前,我们先来稍微了解下map,map是键值对的集合接口,它的实现类主要包括:HashMap, TreeMap, Hashtable以及LinkedHashMap等 ...

  6. java8新特性:对map集合排序,根据key或者value操作排序(升序、降序)

    java8新特性:对map集合排序,根据key或者value操作排序(升序.降序) 直接上代码: package com.drew.test; import java.util.List; impor ...

  7. Java中遍历Map集合的5种方式总结

    这篇文章主要给大家介绍了关于Java中遍历Map集合的5种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值. 方式一 通过Map.keySet使用iterator遍历 ...

  8. java基础入门-04-【集合学生管理系统】

    Java基础入门-04-[集合&学生管理系统] 11.集合&学生管理系统 11.1.ArrayList 集合和数组的优势对比: 11.1.1 ArrayList类概述 11.1.2 A ...

  9. JAVA中的Map集合

    JAVA中的Map集合 1.Map简介 java.util.map接口 1.Map称为查找表,该数据结构的样子是一个"多行两列"的表格,左列为key,右列为value,Map总是根 ...

  10. 【Java基础·Comparator多字段排序】

    [Java基础·Comparator多字段排序] 需求 对指定List按照 身份证号.姓名.入学时间倒序排列 版本1 package com.biaogexf.tools;import lombok. ...

最新文章

  1. 【numpy】协方差计算
  2. 做业务与技术之间的桥梁
  3. 跳转路径时资源路径加/和不加/的区别
  4. Java 关于File使用
  5. 3分钟学会python_3分钟学会一个Python小技巧
  6. drools。drools_使用Drools跟踪输出
  7. 第17章:图像分割提取
  8. html一行省略号变手型,鼠标移动到表格的TD上的时候显示成一个手型的样子怎么做?...
  9. Windows Server 2012学习
  10. 中考可以使用计算机吗,中考报志愿必须用电脑吗
  11. ES8新特性_async和await结合发送ajax请求---JavaScript_ECMAScript_ES6-ES11新特性工作笔记051
  12. Intel发6款全新9代i9/i7/i5 CPU:巅峰8核
  13. 基于Swoole和beanstalkd实现多进程处理消息队列。
  14. dotween路径移动_使用DOTween Pro插件设置物体移动的位置、移动的方式、以及动画结束时执行方法...
  15. kubernetes视频教程笔记 (23)-存储-Volume
  16. win7卡在正在启动windows界面_Windows系统电脑卡在开机界面进不去系统解决方法
  17. 3D打印Gcode文件命令详解
  18. 申论文章观点的打造技巧
  19. Oracle OAF 学习小结(1)- 个性化详解
  20. 全国卖菜大爷将大面积失业,社区团购夺走卖菜商贩生计,真的会出问题吗

热门文章

  1. 10种流行的Java框架
  2. 软件企业变更管理流程
  3. http中长连接与短连接的区别,和实现方式。
  4. 配置无线AP 采用POE供电模块怎么配置无线AP没有POE交换机
  5. 电机-PID学习-位置速度串级控制
  6. 必看!!作为电工,你为什么要学PLC?
  7. SuiteCRM添加自定义字段
  8. 单机:Oracle 19C 数据库一键安装
  9. Spring cloud ribbon实现灰度发布
  10. android车载导航测试,嘟嘟车心安卓车载导航开箱体验