Java Map集合利用比较器Comparator根据Key和Value的排序_最是那一低头的温柔的博客-程序员秘密

技术标签: 综合  Java对象之集合  Java8  

Java技术学习 https://www.itkc8.com

查看原文:http://www.ibloger.net/article/154.html

TreeMap排序

根据Key进行排序

Map的根据key排序需要用到TreeMap对象,因为它是默认按照升序进行输出的,可以使用比较器compareTo对它进行降序排序,Comparator可以对集合对象或者数组进行排序的比较器接口,实现该接口的public compare(T o1,To2)方法即可实现排序,该方法主要是根据第一个参数o1,小于、等于或者大于o2分别返回负整数、0或者正整数,若是按照升序可以直接省略比较器代码Map<String, String> treeMap = new TreeMap<String, String>();

如下代码

 

[java] view plain copy  print?

  1. Map<String, String> treeMap = new TreeMap<String, String>(new Comparator<String>() {  
  2.     @Override  
  3.     public int compare(String o1, String o2) {  
  4.         // return o1.compareTo(o2); // 默认:升序排列  
  5.         return o2.compareTo(o1);  // 降序排列  
  6.         // return 0;    // 只返回存储的第一个key的值,这里是"ccccc"  
  7.     }  
  8. });  
  9. treeMap.put("c""ccccc");  
  10. treeMap.put("a""aaaaa");  
  11. treeMap.put("b""bbbbb");  
  12. treeMap.put("d""ddddd");  
  13.   
  14. for (String key : treeMap.keySet()) {  
  15.     System.out.println(key+" : "+treeMap.get(key));  
  16. }  

输出:

 

d : ddddd
c : ccccc
b : bbbbb
a : aaaaa
 

 

根据value排序

对value排序我们就需要借助于Collections的sort(List<T> list, Comparator<? super T> c)方法,该方法根据指定比较器产生的顺序对指定列表进行排序。但是有一个前提条件,那就是所有的元素都必须能够根据所提供的比较器来进行比较。

 

这种方法通用于key和value排序,只需将比较器中o1.getValue().compareTo(o2.getValue())的getValue()改为getKey()即可。

如下:

 

[java] view plain copy  print?

  1. Map<String, String> treeMap = new TreeMap<String, String>();  
  2. treeMap.put("c""jock");  
  3. treeMap.put("a""rapido");  
  4. treeMap.put("d""free");  
  5. treeMap.put("b""linda");  
  6.   
  7. // 这里将map.entrySet()转换成list  
  8. List<Map.Entry<String, String>> list = new ArrayList<Map.Entry<String, String>>(treeMap.entrySet());  
  9.   
  10. // 然后通过比较器来实现排序  
  11. Collections.sort(list, new Comparator<Map.Entry<String, String>>() {  
  12.     @Override  
  13.     public int compare(Entry<String, String> o1, Entry<String, String> o2) {  
  14.         // return 0;  // 降序  
  15.         // return o2.getValue().compareTo(o1.getValue()); // 降序  
  16.         return o1.getValue().compareTo(o2.getValue()); // 升序  
  17.     }  
  18. });  
  19.   
  20. for (Map.Entry<String, String> mapping : list) {  
  21.     System.out.println(mapping.getKey() + ":" + mapping.getValue());  
  22. }  

 

输出:

d:free
c:jock
b:linda
a:rapido
 

注意:

经过上面示例代码的测试发现,

使用第一种匿名内部类方式进行key排序,比较器返回的若是0,则值只有第一条首先插入的输出,而且只输出一条数据。

使用第二种list和比较器方式进行key或value排序,比较器返回的若是0,则值和倒序的值一样,有多少输出多少。(若有朋友知道原因还请文章下留言,谢谢)

 

HashMap排序

我们都是HashMap的值是没有顺序的,他是按照key的HashCode来实现的。对于这个无序的HashMap我们要怎么来实现排序呢?参照TreeMap的value排序,我们一样的也可以实现HashMap的排序。

经过Key排序

与TreeMap的根据value比较方式一样,将new TreeMap<String, String>();改为new HashMap<String, String>(),再将比较器的getValue换成getKey就行。

经过value排序

与TreeMap的根据value比较方式一样,将new TreeMap<String, String>();改为new HashMap<String, String>();就行。

Java技术学习 https://www.itkc8.com

其他的Map类型排序都可参考以上方法进行

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/HUXU981598436/article/details/78504726

智能推荐

Java导出Excel时生成下拉框_ttxs_hc的博客-程序员秘密

近日在工作中遇到使用POI生成excel模板的需求,数据库取出所有类型生成excel下拉列表供用户选择。使用的POI版本为3.14 两种方案,第一种的缺点是列表数据量不能超过128。方案一 public static HSSFWorkbook write(InputStream inputS...

配置与优化_配置方案优化_xiaoxiao1777的博客-程序员秘密

通过vue-cli3.0工具生成的项目,默认隐藏了所有webpack的配置项,目的是为了屏蔽项目的配置过程,让开发者把工作的中心,放到功能和业务逻辑上如果有修改webpack默认配置的需求,可以在项目根目录中,按需创建vue.config.js这个配置文件默认情况下,通过import导入的第三方依赖包,会最终打包合并到一个文件中,从而导致打包文件体积过大的问题,如在ui可视化面板中,可以看到资源中第一个文件体积特别大为了解决以上问题,可以通过webpack的externals的节点,来配置加载外

给 Android 和 iOS 开发人员不一样的 Flutter 基础讲解_恋猫de小郭的博客-程序员秘密

因为最近公司来了新人,之前很少接触过跨平台应用开发,所以为了给他们介绍关于 Flutter 的一些基础,这里特意整理了一份通用性质的常识性讲解,结尾顺便介绍一个有趣的案例。一、单页面应用了解 Flutter 之前,首先介绍一个简单基础知识点,那就是大部分的移动端跨平台框架都是“单页面”应用。什么是“单页面”应用?也就是对于原生 Android 和 iOS 而言,整个跨平台 UI 默认都是运行在一个 Activity / ViewController 上面,默认情况下只会有一个 Activity .

python手机版下载-QPython下载_编程大乐趣的博客-程序员秘密

QPython下载介绍# 关于QPython OHQPython是安卓上的Python引擎,它包含一些有趣的特性,比如Python解释器,运行欢迎,编辑器和QPYPI。它让你更容易地在安卓上使用Python。并且它完全免费。QPython在全球范围内已经有了数百万的用户,它也是一个开源项目。对于不同的使用场景,QPython有两个分支,QPython Ox和3x。QPython 3x主要是给有经验...

cqyz oj | 【重庆市NOIP模拟赛】数据 | DP动态规划 | 堆优化_banla3330的博客-程序员秘密

Description  Mr_H出了一道信息学竞赛题,就是给 n 个数排序。输入格式是这样的:  试题有若干组数据。每组数据的第一个是一个整数 n,表示总共有 n 个数待排序;接下来 n 个整数,分别表示这n个待排序的数。  例如:3 4 2 ?1 4 1 2 3 4,就表示有两组数据。第一组有3个数(4,2,-1),第二组有4个数(1,2,3,4)。可是现在Mr_H做的输入数据...

ubuntu18.0及以下所有版本镜像下载_ubuntu18.0下载_天才程序YUAN的博客-程序员秘密

ubuntu18.0及以下所有版本镜像下载ubuntu镜像下载地址,检测有效,速度较快,1560KB左右每秒http://mirrors.hit.edu.cn/

随便推点

解决pymysql.err.InternalError: (1054, "Unknown column 'nan' in 'field list'") 的问题_Ch3n的博客-程序员秘密

使用pandas过程中,数据转化成DataFrame格式会将缺失值会用NAN填充, 如果直接将数据用pymysql写入数据库会报错,此时需要将NAN替换成None , 因为None插入数据库会被填写Null 也就是数据库中的空值报错信息:pymysql.err.InternalError: (1054, "Unknown column 'nan' in 'field ...

基于Bootstrap4写的一个JQuery分页插件_bootstrap4的jquery分页插_我们的时光_的博客-程序员秘密

为了便于代码阅读,移至 https://github.com/yyycode/jquery-bootstrap4-pagination

HBase隔离方案实战-rsgroup_rs-group_稼轩wn的博客-程序员秘密

本文参考: https://www.jianshu.com/p/04d56a2c8b5c  , 这篇文章写的很好, 就是命令没法用, 一度以为我们的集群不支持rsgroup, 无意中试出了帮助命令, 才发现, 命令不太对, 不知道是作者粗心还是每个版本的命令不一样, 这里做了一些修正, 我们的集群是CDH5.12.1, hbase是1.2.0 HBase适合用于海量数据的存储,横向扩展非常...

hadoop学习系统_hadoop系统学习_hyy1568786的博客-程序员秘密

hadoop学习系统1.hadoop的常见命令2.hadf读写hadf上传文件:https://blog.csdn.net/gscsd_t/article/details/79949688(1。问题分块是客户端完成的吗 https://blog.csdn.net/clerk0324/article/details/508878662.datanode是什么一致性 h...

有没有人可以帮我解析一下下面的json_"json\":\"59af86ec3030dee574a86864584a607d\",\"txt_lsq357642696的博客-程序员秘密

{"data":[{"datatype":14,"itemdata":[{"banner":"http://imgsrc.baidu.com/anxun/pic/item/80cb39dbb6fd5266321bfe7ea818972bd40736ac.jpg","desc":"专业美妆推荐,潮流服饰搭配,让变美更简单!","title":"","type":"8","icon":"http://

mathtype6.9安装时报错:字体安装失败、缺DLL就重装在默认的C盘下_qigeyonghuming_1的博客-程序员秘密

装mathtype6.9的时候,我把软件装在D盘,然后报了一堆错误,什么安装字体失败啦,dll找不到啦,最快的解决方法:卸载mathtype然后重新安装,安装位置默认在C盘,不要改动直接安装就不会报错了。...

推荐文章

热门文章

相关标签