在上一篇文章中,我向您展示了如何通过键对Java 8中的Map进行排序 ,今天,我将教您如何使用Java 8功能(例如,lambda表达式,方法引用,流和新方法) 按值对Map进行排序。添加到java.util.Comparator和Map.Entry类中。 为了对任何Map进行排序,例如HashMap ,Hashtable,LinkedHashMap,TreemMap甚至ConcurrentHashMap ,您可以首先使用entrySet()方法获取条目集,然后可以通过调用stream()方法获取流。 entrySet()方法返回一个Set,该Set从java.util.Collection类继承stream()方法。 一旦获得流,就可以调用sorted()方法,该方法可以使用Comparator对Stream中可用的所有Map.Entry对象进行排序。

为了按值比较Map的条目,可以使用java.util.Map.Entry类中新添加的Map.Entry.comparingByValue()方法。

这与我们在上一篇文章中使用过的compareByKey()方法相对应。 这两种方法都被重载以与Comparable和Comparator对象一起使用。

对流进行排序后,您可以执行任何操作,例如,如果您只想按排序的顺序打印键,值或条目,则只需使用forEach()方法,或者如果要按值对Map进行排序,则可以您可以使用流类的collect()方法。

此方法接受收集器,并允许您将Stream的所有元素捕获到所需的任何集合中。 例如,如果要排序的地图,则可以使用java.util.stream.Collectors类的toMap()方法。

此方法是重载的,并提供了两种选择,例如,您可以收集任何类型的地图中的条目,也可以指定所需的地图类型,例如,为了使条目保持排序,我们将使用LinkedHashMap 。 它还允许您在相同值的情况下打破平局,例如,可以按想要的顺序排列它们。

顺便说一句,如果您好奇的话,您还可以查看Pluralsight的《 从Java 8使用Lambda表达式到从流到集合》课程,以了解有关特定于集合框架的Java 8新功能的更多信息。

简而言之,以下是在Java 8中按值升序或降序对HashMap进行排序的确切步骤,假设您已经有一个map对象

  1. 通过调用Map.entrySet()方法获取条目集
  2. 通过调用stream()方法获取条目流
  3. 用Comparator调用排序的方法
  4. 使用Map.Entry.comparingByValue()比较器按值对条目进行排序
  5. 使用collect()方法收集结果
  6. 使用Collectors.toMap()方法在另一个Map中获取结果。
  7. 在最后一个参数中提供LinkedHashMap :: new,以强制其返回LinkedHashMap,以保留排序顺序
  8. 为了按降序排序,只需使用Java 8的Collections.reverseOrder()或Comparator.reverse()方法来颠倒Comparator的顺序,有关添加到关键Java类中的新方法的完整列表,请参阅Java SE 8,对于Really Im耐心 。例如Java Collection Framework,String和Comparator等。

完成此步骤后,您将获得一个按值排序的Map。 现在您已经了解了理论和步骤,现在让我们看下一节中的代码示例以使其正确。

Java程序按值对地图排序

这是我们完整的Java程序,使用Java 8功能按值对Map进行排序,例如,通过使用接口上的默认方法和静态方法对Java 8中的现有类进行开发,从而对Java 8中现有类的新方法进行了排序。 在此示例中,我获得了项目地图及其费用(例如租金,公用事业,交通等)的Map。Map关键字是String ,代表项目,值是Integer,即费用。 我们的任务是按值对“地图”进行排序,以找出哪个项目花费最多,并按值的降序打印所有项目。

import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;import static java.util.stream.Collectors.*;
import static java.util.Map.Entry.*;/** Java Program to sort a Map by values in Java 8* */
public class Main {public static void main(String[] args) throws Exception {// a Map with string keys and integer valuesMap<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("map before sorting: " + budget);// let's sort this map by values firstMap<String, Integer> sorted = budget.entrySet().stream().sorted(comparingByValue()).collect(toMap(e -> e.getKey(), e -> e.getValue(), (e1, e2) -> e2,LinkedHashMap::new));System.out.println("map after sorting by values: " + sorted);// above code can be cleaned a bit by using method referencesorted = budget.entrySet().stream().sorted(comparingByValue()).collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,LinkedHashMap::new));// now let's sort the map in decreasing order of valuesorted = budget.entrySet().stream().sorted(Collections.reverseOrder(Map.Entry.comparingByValue())).collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,LinkedHashMap::new));System.out.println("map after sorting by values in descending order: "+ sorted);}}Output
map before sorting: {grocery=150, utility=130, miscellneous=90, rent=1150,clothes=120, transportation=100}
map after sorting by values: {miscellneous=90, transportation=100,clothes=120, utility=130, grocery=150, rent=1150}
map after sorting by values in descending order: {rent=1150, grocery=150,utility=130, clothes=120, transportation=100, miscellneous=90}

您可以看到,在对地图进行排序之前,按照值将其随机排列,但是首先,我们对它们进行了按值的升序排序,然后对相同的Map进行了按值的降序排序,这就是为什么租金排在第一位的原因,它使我们付出了最高的代价。

一些技巧

1)使用静态导入可以缩短代码,可以静态导入Map.Entry和Collectors类。

2)尽可能使用方法引用代替lambda表达式。 请参阅本文章以了解更多有关如何lambda表达式转换为方法的引用在Java中8,如果你不熟悉的。

这就是如何在Java 8中按值对Map进行排序的全部内容。 您可以看到,使用添加到现有类的新方法对Map进行排序非常容易。 一切皆有可能,因为JDK 8的默认方法功能使您可以向现有类添加新方法。 在进行此增强之前,在Java中不破坏接口的现有客户端是不可能的,因为一旦将新方法添加到接口中,它的所有客户端都必须实现它。 如果方法是默认方法或静态方法,则不再需要此方法,因为它们不是抽象方法而是具体方法。

进一步阅读

Java 8的新增功能

Java SE 8实在不耐烦

使用Lambda表达式从Java 8中的集合到流

相关的Java 8教程

如果您有兴趣学习有关Java 8的新功能的更多信息,这是我以前的文章,介绍Java 8的一些重要概念:

  • 从零开始学习Java 8的5本书( 书籍 )
  • Java 8中的默认方法是什么? ( 示例 )
  • 如何在Java 8中连接String( 示例 )
  • 如何在Java 8中使用filter()方法( 教程 )
  • 如何在Java 8中使用LocalDateTime格式化/解析日期? ( 教程 )
  • 如何在Java 8中使用Stream类( 教程 )
  • 如何在Java 8中将列表转换为Map( 解决方案 )
  • Java 8中抽象类和接口之间的区别? ( 回答 )
  • Java 8中20个日期和时间的示例( 教程 )
  • 如何在Java 8中使用peek()方法( 示例 )
  • 如何在Java 8中按键对地图排序? ( 示例 )
  • 如何在Java 8中按值对may进行排序? ( 示例 )
  • Java 8中的Optionals的10个示例? ( 示例 )

感谢您到目前为止阅读本文。 如果您喜欢这篇文章,请与您的朋友和同事分享。 如果您有任何疑问或建议,请发表评论。

翻译自: https://www.javacodegeeks.com/2017/09/java-8-sorting-hashmap-values-ascending-descending-order.html

Java 8 –按值对HashMap进行升序和降序排序相关推荐

  1. 【Java】用sort实现对数组的升序和降序排序

    Java 用 sort 实现对数组的升序和降序排序 一.ArrayList 的升序与降序 二.数组升序 三.数组降序 方法一 方法二 一.ArrayList 的升序与降序 升序:Collections ...

  2. php表格单元格怎么实现排序,angularjs,_angular表格点击序号进行升序,降序排序,怎么实现。,angularjs - phpStudy...

    angular表格点击序号进行升序,降序排序,怎么实现. 序号内容姓名地点时间序号 {{$index + 1}}{{$index + 1}}{{$index + 1}}{{$index + 1}}{{ ...

  3. python升序和降序排序sort_【python】 sort、sorted高级排序技巧

    这篇文章主要介绍了Python中列表(List)的详解操作方法,包含创建.访问.更新.删除.其它操作等,需要的朋友可以参考下 Python list内置sort()方法用来排序,也可以用python内 ...

  4. python怎么升序和降序排序?

    python怎么升序和降序排序 推荐:<python视频教程> 1.首先打开cmd命令提示符,输入指令"ipython"打开python的命令行工具: 2.在命令行中先 ...

  5. python怎么升序和降序排序

    python怎么升序和降序排序 1.首先打开cmd命令提示符,输入指令"ipython"打开python的命令行工具: 2.在命令行中先定义一个变量number数组,里面写入几个数 ...

  6. python升序和降序排序_python中序列的排序,包括字典排序、列表排序、升序、降序、逆序...

    一.基础概念 我们知道python中的内建序列包括字典.列表.元组.字符串等,序列是python中最基本的数据结构. 列表.元组.字符串这类的序列的索引默认第一个元素的索引从0开始,第二个元素的索引是 ...

  7. 5.10 数据的升序和降序排序 [原创Excel教程]

    原文:http://coolketang.com/staticOffice/5a97f32ad50eee266a9bbac7.html 1. 本节课将为您演示,如何对工作表中的数据进行升序或降序排列. ...

  8. Python对IP地址列表排序、对列表进行去重、IP地址与MAC地址组合的多个元组的列表排序,对列表内的元组升序和降序排序

    1.python对IP地址列表排序 # -*- coding: utf-8 -*-import socket listIP = ['10.5.11.1', '192.168.1.33', '10.5. ...

  9. c#sort升序还是降序_C#中对数组或集合进行升序或降序排序

    在.net framework中,数组和集合都实现了用于排序的方法sort(),数组通过调用Array.Sort(数组名)排序,集合通过调用 集合对象.Sort()方法排序. 默认的排序是使用升序排列 ...

最新文章

  1. Django快速分页
  2. 二:熟悉 TCP/IP 协议
  3. 在silverlight中,创建webservice的client报错
  4. 50道编程小题目之【兔子数量】
  5. JPM Coin三部曲 (上) :深入理解摩根幣的運作
  6. java 获取当前年_java中的反射(三) - kelexin
  7. ERROR Utils: Uncaught exception in thread stdout writer for python
  8. 【转】cron表达式详解
  9. 基于单片机的电子万年历的设计
  10. bootice添加黑苹果引导_手把手教你安装黑苹果之U盘安装篇
  11. 【数学和算法】加权平均法
  12. 大数据兼云计算(王明龙)讲师-JAVA-DAY05-基本数据类型
  13. Unity3DCPU优化方法相关理论知识
  14. A7139射频模块wor配置解析
  15. promise是什么
  16. 三体船的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  17. dvwa中的xss(跨站脚本)攻击
  18. android动态获取地理位置权限,Android6.0获取GPS定位和获取位置权限和位置信息的方法...
  19. 计算机网络ospf实验报告,计算机网络实验报告 12_OSPF实验.doc
  20. 《草书识别》隐私政策

热门文章

  1. SpringBoot2.1.9 多MongoDB配置
  2. SpringMVC+Spring4+Mybatis3集成,开发简单Web项目+源码下载
  3. JVM 调优系列之监控工具
  4. IDE:Eclipse查看Servlet源码
  5. 分布式一致性算法:可能比你想象得更复杂
  6. Servlet使用适配器模式进行增删改查案例(EmpDaoImpl.java)
  7. JS原型链中的属性问题
  8. Greendao bean序列化出现的 问题!
  9. Java bytecode instruction listings
  10. Flex布局 让你的布局更完美