在实际业务开发中,可能会遇到Java Map按值排序的需要。

Java Map按值排序的常见思路是

1、 将map中的entry放到List中

2、 对List中的entry通过比较器按值排序

3 、将排序后的entry放到linkedhashmap中

Java 8利用Stream

import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;import static java.util.Map.Entry.comparingByValue;
import static java.util.stream.Collectors.toMap;public class SortTest {public static void main(String[] args) throws Exception {// 创建一个字符串为Key,数字为值的mapMap<String, Integer> budget = new HashMap<>();budget.put("clothes", 120);budget.put("grocery", 150);budget.put("transportation", 100);budget.put("utility", 130);budget.put("rent", 1150);budget.put("miscellneous", 90);System.out.println("排序前: " + budget);// 按值排序 升序Map<String, Integer> sorted = budget.entrySet().stream().sorted(comparingByValue()).collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,LinkedHashMap::new));System.out.println("升序按值排序后的map: " + sorted);// 按值排序降序sorted = budget.entrySet().stream().sorted(Collections.reverseOrder(comparingByValue())).collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,LinkedHashMap::new));System.out.println("降序按值排序后的map: " + sorted);}}

可以封装成工具类

/*** Map排序工具类** @author liuwangyanghdu@163.com  明明如月*/
public class MapSortUtil {private static Comparator<Map.Entry> comparatorByKeyAsc = (Map.Entry o1, Map.Entry o2) -> {if (o1.getKey() instanceof Comparable) {return ((Comparable) o1.getKey()).compareTo(o2.getKey());}throw new UnsupportedOperationException("键的类型尚未实现Comparable接口");};private static Comparator<Map.Entry> comparatorByKeyDesc = (Map.Entry o1, Map.Entry o2) -> {if (o1.getKey() instanceof Comparable) {return ((Comparable) o2.getKey()).compareTo(o1.getKey());}throw new UnsupportedOperationException("键的类型尚未实现Comparable接口");};private static Comparator<Map.Entry> comparatorByValueAsc = (Map.Entry o1, Map.Entry o2) -> {if (o1.getValue() instanceof Comparable) {return ((Comparable) o1.getValue()).compareTo(o2.getValue());}throw new UnsupportedOperationException("值的类型尚未实现Comparable接口");};private static Comparator<Map.Entry> comparatorByValueDesc = (Map.Entry o1, Map.Entry o2) -> {if (o1.getValue() instanceof Comparable) {return ((Comparable) o2.getValue()).compareTo(o1.getValue());}throw new UnsupportedOperationException("值的类型尚未实现Comparable接口");};/*** 按键升序排列*/public static <K, V> Map<K, V> sortByKeyAsc(Map<K, V> originMap) {if (originMap == null) {return null;}return sort(originMap, comparatorByKeyAsc);}/*** 按键降序排列*/public static <K, V> Map<K, V> sortByKeyDesc(Map<K, V> originMap) {if (originMap == null) {return null;}return sort(originMap, comparatorByKeyDesc);}/*** 按值升序排列*/public static <K, V> Map<K, V> sortByValueAsc(Map<K, V> originMap) {if (originMap == null) {return null;}return sort(originMap, comparatorByValueAsc);}/*** 按值降序排列*/public static <K, V> Map<K, V> sortByValueDesc(Map<K, V> originMap) {if (originMap == null) {return null;}return sort(originMap, comparatorByValueDesc);}private static <K, V> Map<K, V> sort(Map<K, V> originMap, Comparator<Map.Entry> comparator) {return originMap.entrySet().stream().sorted(comparator).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,LinkedHashMap::new));}}
package com.chujianyun.common.map;import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;import java.util.HashMap;
import java.util.Map;/*** Map排序工具类** @author liuwangyanghdu@163.com  明明如月*/
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class MapSortUtilTest {// 创建一个字符串为Key,数字为值的mapMap<String, Integer> budget = new HashMap<>();@BeforeAllpublic void init() {budget.put("clothes", 120);budget.put("grocery", 150);budget.put("transportation", 100);budget.put("utility", 130);budget.put("rent", 1150);budget.put("miscellneous", 90);System.out.println("排序前: " + budget);}@Testvoid sortByKeyAsc() {System.out.println("按键升序" + MapSortUtil.sortByKeyAsc(budget));}@Testvoid sortByKeyDesc() {System.out.println("按键降序" + MapSortUtil.sortByKeyDesc(budget));}@Testvoid sortByValueAsc() {System.out.println("按值升序" + MapSortUtil.sortByValueAsc(budget));}@Testvoid sortByValueDesc() {System.out.println("按值降序" + MapSortUtil.sortByValueDesc(budget));}
}

Java 7版本


import java.util.*;
import java.lang.*; public class GFG { //  hashmap按值排序public static HashMap<String, Integer> sortByValue(HashMap<String, Integer> hm) { // HashMap的entry放到List中List<Map.Entry<String, Integer> > list = new LinkedList<Map.Entry<String, Integer> >(hm.entrySet()); //  对List按entry的value排序Collections.sort(list, new Comparator<Map.Entry<String, Integer> >() { public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return (o1.getValue()).compareTo(o2.getValue()); } }); // 将排序后的元素放到LinkedHashMap中HashMap<String, Integer> temp = new LinkedHashMap<String, Integer>(); for (Map.Entry<String, Integer> aa : list) { temp.put(aa.getKey(), aa.getValue()); } return temp; } public static void main(String[] args) { HashMap<String, Integer> hm = new HashMap<String, Integer>(); // 填充测试数据hm.put("Math", 98); hm.put("Data Structure", 85); hm.put("Database", 91); hm.put("Java", 95); hm.put("Operating System", 79); hm.put("Networking", 80); Map<String, Integer> hm1 = sortByValue(hm); // 打印按值排序后的数据for (Map.Entry<String, Integer> en : hm1.entrySet()) { System.out.println("Key = " + en.getKey() + ", Value = " + en.getValue()); } }
} 

Java Map排序相关推荐

  1. Java Map排序详解

    一)Map简介 java.util.Map是一个键值对集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等. HashMap:最常用的Map ...

  2. JAVA map排序实现

    Map排序的方式有很多种,这里记录下自己总结的两种比较常用的方式:按键排序(sort by key), 按值排序(sort by value). 1.按键排序 jdk内置的java.util包下的Tr ...

  3. java map 排序_java集合框架面试题大集合

    1.介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)[基础] 答:Collection FrameWork 如下: Collection: ├List │├Link ...

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

    在这篇文章中,您将学习如何使用Java对Map按照键或值进行排序.前几日有位朋友面试遇到了这个问题,看似很简单的问题,但是如果不仔细研究一下也是很容易让人懵圈的面试题.所以我决定写这样一篇文章.在Ja ...

  5. java map集合排序的_Java对Map集合进行排序

    Java对Map集合进行排序 实现 Comparator 接口,重写compare方法,完成自定义排序 int compare(Object o1, Object o2) 返回一个基本类型的整型 如果 ...

  6. Java Map 自定义排序

    HashMap是不保证顺序的,要有顺序,要用LinkedHashMap,这是按照插入顺序排列的. Map接口的哈希表和链接列表实现,具有可预知的迭代顺序.此实现与HashMap的不同之处在于,后者维护 ...

  7. java map对象排序输出_java实现对象的排序(List和Map)

    java实现对象的排序(List和Map) List和Map的排序 在实际的开发当中,我们经常 在文件浏览的时候经常有多种浏览方式,按时间整箱排序,逆向排序,按大小正逆向排序 ,按 按价格正逆向排序, ...

  8. Map排序(Java)

    Java中的Map排序问题 在Java编写程序的过程中,常常会碰到使用map(key,value)来记录数据的情况,有些时候我们需要根据实际需要来对map中的数据进行排序.以下就是个人总结的map排序 ...

  9. Java Map按value值的大小进行排序

    Map排序工具类如下: import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import ...

  10. 有关于Java Map,应该掌握的8个问题

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:一个线程池 bug 引发的 GC 思考!个人原创+1博客:点击前往,查看更多 前言 最近几天看了几篇有关于Jav ...

最新文章

  1. C语言中常用计时方法总结
  2. Apache 'mod_accounting'模块SQL注入漏洞(CVE-2013-5697)
  3. WebDriverAgent安装到iphone真机
  4. 软键盘弹起,导致底部被顶上去
  5. SSM框架笔记14:Spring MVC表单验证
  6. 网站服务器需要定期重启吗,数据库服务器需要定期重启吗
  7. Unity如何刚体控制物体的移动以及旋转
  8. 利用Python和OpenCV进行面部表情识别
  9. html元素 按键精灵鼠标移动,按键精灵后台鼠标移动和点击脚本怎么制作。
  10. python 软件包 petri_常用Petri网模拟软件工具简介
  11. 开发那点事(五)vue开发移动端app案例
  12. 基于ESXi虚拟服务器搭建
  13. 从古代遗传下来的设计值得一看!
  14. 推荐,Java Emoji Converter(Emoji表情转换工具)
  15. IDEA自动补全tab键向下选择s-tab向上选择
  16. XDM-跨文档消息传送
  17. Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 8.074 s <<< FAILURE - in com.xxx.X
  18. 在java语言中 ()方法是不可以继承的_Java 语言中,构造方法是不可以继承的。( )_学小易找答案...
  19. 第一性原理计算筛选本征二维磁性材料
  20. Cohen's kappa coefficient

热门文章

  1. 智方8000系进销存管理系统 v11.29 绿色
  2. sqlldr mysql_sqlldr数据导入
  3. 矩阵转置相关公式_透析矩阵,由浅入深娓娓道来—高数-线性代数-矩阵
  4. 华为荣耀magic2手机系统更新鸿蒙,华为荣耀Magic2怎么禁止系统更新功能_如何关闭和禁用系统更新...
  5. 简洁404页面源码 | 自适应404页面HTML源代码下载
  6. 项目——网络对战五子棋(Web-Gobang)
  7. PHP完全自学手册(文档教程)
  8. 海思EC6108V9盒子DIY固件打包方法
  9. 小米手机解锁bootload教程及常见问题
  10. 关于SO、SOP、SOIC封装(宽体、中体、窄体)的详解