map集合排序

这篇文章讲的不仅仅是map排序,比如把对象按某一属性排序,它都可以解决这些问题。

比如,有N个对象,每个对象有个属性就是成绩,成绩分:优秀,良好,合格。那我们如何按照成绩的好坏进行排序呢,下面请看代码。

1.people对象

  1. package com.test;
  2.  
  3. /*people对象其实很简单,就提供了三个属性*/
  4.  
  5. class People {
  6.  
  7. private String Name; //姓名
  8. private String Score; //成绩
  9. private String id; //学号
  10.  
  11. public String getName() {
  12. return Name;
  13. }
  14.  
  15. public void setName(String name) {
  16. Name = name;
  17. }
  18.  
  19. public String getScore() {
  20. return Score;
  21. }
  22.  
  23. public void setScore(String score) {
  24. Score = score;
  25. }
  26.  
  27. public String getId() {
  28. return id;
  29. }
  30.  
  31. public void setId(String id) {
  32. this.id = id;
  33. }
  34.  
  35. public People(String name, String score, String id) {
  36. super();
  37. Name = name;
  38. Score = score;
  39. this.id = id;
  40. }
  41. }

2.主要方法

  1. package com.test;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collections;
  5. import java.util.Comparator;
  6. import java.util.HashMap;
  7. import java.util.Iterator;
  8. import java.util.LinkedHashMap;
  9. import java.util.List;
  10. import java.util.Map;
  11. import java.util.Map.Entry;
  12. import java.util.Set;
  13. import java.util.TreeMap;
  14.  
  15. /**
  16. * Map进行多条件排序输出
  17. * 成绩具有优秀,合格,不合格好吃属性。
  18. * 入口Map
  19. * 首先按照优秀,合格,不合格排序
  20. * 然后按照人名的标志Id排序
  21. * 出口Map
  22. *
  23. *
  24. */
  25. public class MainSort {
  26.  
  27. /**
  28. * 准备参数,创建对象
  29. * @return
  30. */
  31. private static Map<String, People> getPeopleMap() {
  32. Map<String,People> PeopleMap = new TreeMap<>();
  33.  
  34. // 创建对象
  35. People b = new People("小明" , "优秀", "b");
  36. People a = new People("小红" , "合格", "a");
  37. People c = new People("丁丁" , "合格", "c");
  38. People d = new People("冬冬" , "良好", "d");
  39. People e = new People("小黄" , "优秀", "e");
  40. People f = new People("小李" , "良好", "f");
  41. People g = new People("小钟" , "优秀", "g");
  42.  
  43. // 添加乱序key值,把对象放入map集合
  44. PeopleMap.put("xniem", b);
  45. PeopleMap.put("akjd", a);
  46. PeopleMap.put("uioo", c);
  47. PeopleMap.put("qw84", d);
  48. PeopleMap.put("584sdf'", e);
  49. PeopleMap.put("4aisdf", f);
  50. PeopleMap.put("458jsf", g);
  51.  
  52. return PeopleMap;
  53. }
  54.  
  55. /**
  56. * 循环打印Map
  57. */
  58. private static void show(Map<String, People> PeopleMap) {
  59. // 循环Map 这个打印肯定是无序的,也不是按放入的先后顺序
  60. for (Map.Entry<String, People> PeopleOneMap : PeopleMap.entrySet()) {
  61. People People = PeopleOneMap.getValue();
  62. System.out.println(People.getName() + " " + People.getScore()+ " " + People.getId() );
  63. }
  64. }
  65.  
  66. /*
  67. * 由于List能够直接使用Collections进行排序
  68. * 但是Map不行。
  69. * 这边所做的操作就是先将Map--》List
  70. * 然后对List进行排序
  71. * 然后在讲List--》转换成LinkedHashMap
  72. *
  73. */
  74. public static Map<String, People> sortMapByValue(Map<String, People> PeopleMap) {
  75. if (PeopleMap == null || PeopleMap.isEmpty()) {
  76. return null;
  77. }
  78. // LinkedHashMap是有序的、或者TreeMap都是有序的(这里只能用LinkedHashMap)
  79. Map<String, People> sortedMap = new LinkedHashMap<String, People>();
  80.  
  81. /* Set set=PeopleMap.entrySet(); PeopleMap.entrySet()返回的是一个set集合
  82. * 再讲ArrayList(Collection<? extends E> c) 可以放collection,set集合是其子类,map不行哦
  83. * 这步就是把map集合转为ArrayList集合
  84. */
  85.  
  86. List<Map.Entry<String, People>> entryList = new ArrayList<Map.Entry<String, People>>(PeopleMap.entrySet());
  87.  
  88. //这步是关键,进过这步之后,entryList已经是个有序的ArrayList集合了
  89. Collections.sort(entryList, new MapValueComparator());
  90. //通过迭代器取出
  91. Iterator<Map.Entry<String, People>> iter = entryList.iterator();
  92. // Map.Entry<String, People>,就是包装了一个map节点,这个节点封装了key,value值,以及别的值(比如hashmap中哈希码和next指针)
  93. Map.Entry<String, People> tmpEntry = null;
  94. while (iter.hasNext()) {
  95. tmpEntry = iter.next();
  96. sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());
  97. }
  98. return sortedMap;
  99. }
  100.  
  101. /**
  102. * 主方法
  103. *
  104. */
  105. public static void main(String[] args) {
  106. // 获取Map
  107. Map<String,People> PeopleMap = getPeopleMap();
  108. // 打印未排序的Map
  109. show(PeopleMap);
  110. System.out.println("-----------before-----------");
  111. // 打印排序完了的Map
  112. show(MainSort.sortMapByValue(PeopleMap));
  113. System.out.println("-----------after------------");
  114. }
  115. }

3.Comparator方法

  1. package com.test;
  2.  
  3. import java.util.Comparator;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. import java.util.Map.Entry;
  7.  
  8. class MapValueComparator implements Comparator<Map.Entry<String, People>> {
  9.  
  10. @Override
  11. public int compare(Entry<String, People> o1, Entry<String, People> o2) {
  12.  
  13. // 获取比较的两个对象
  14. People People1 = o1.getValue();
  15. People People2 = o2.getValue();
  16.  
  17. // 将成绩映射成具有比较关系的字符1、2、3
  18. Map<String,Integer> tasteLev = new HashMap<>();
  19. tasteLev.put("优秀", 1);
  20. tasteLev.put("良好", 2);
  21. tasteLev.put("合格", 3);
  22.  
  23. int cr = 0;
  24. // 判断成绩
  25. int a = tasteLev.get(People2.getScore())-tasteLev.get(People1.getScore());
  26. if (a!=0) {
  27. cr = (a>0) ? -1 : 2;
  28. } else {
  29.  
  30. /*其实上面就可以按成绩优秀,良好,合格排序了,
  31. *在做一步目的,就是在成绩相同的情况下,在按照学号进行排序
  32. */
  33.  
  34. // 按照对应的Id排序
  35. a = People2.getId().compareTo(People1.getId());
  36. if (a!=0) {
  37. cr = (a>0)? -2 : 1;
  38. }
  39. }
  40. /* 注意上面对一个返回值对应的就是形成比较层次
  41. * 上层
  42. * --> 2
  43. * --> -1
  44. * 下层
  45. * --> 1
  46. * --> -2
  47. */
  48. return cr;
  49. }
  50. }

最后我们再来看后台输出

【Java进阶】---map集合排序的更多相关文章

  1. Java提高(5)---map集合排序

    map集合排序 这篇文章讲的不仅仅是map排序,比如把对象按某一属性排序,它都可以解决这些问题. 比如,有N个对象,每个对象有个属性就是成绩,成绩分:优秀,良好,合格.那我们如何按照成绩的好坏进行排序 ...

  2. java基础-Map集合

    java基础-Map集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Map集合概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它 ...

  3. map集合排序

    默认情况下,HashMap.HashTable.TreeMap.LinkedHashMap的排列顺序比较: package com.per.sdg.demo; import java.util.Has ...

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

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

  5. Java基础知识:Java实现Map集合二级联动1

    Java实现Map集合二级联动 Map集合可以保存键值映射关系,这非常适合本实例所需要的数据结构,所有省份信息可以保存为Map集合的键,而每个键可以保存对应的城市信息,本实例就是利用Map集合实现了省 ...

  6. Java基础操作面试题:Map集合排序 需要TreeMap 构造方法参数有比较器 输入字符串,统计A、B、C、D、出现次数,由高到低输出字母和出现次数,使用Map集合完成此题

    Map和Collections是同级别的,不能像List排序那样直接用Collections.sort(new Comparator<?>(){ 复写compara方法}); HashMa ...

  7. java中Map集合的理解

    Map |--Hashtable:底层是哈希表数据结构,不可以存入null键null值.该集合是线程同步的.jdk1.0.效率低. |--HashMap:底层是哈希表数据结构,允许使用 null 值和 ...

  8. java中map集合的迭代

    import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class TestMap { pu ...

  9. Java实现Map集合二级联动

    Map集合可以保存键值映射关系,这非常适合本实例所需要的数据结构,所有省份信息可以保存为Map集合的键,而每个键可以保存对应的城市信息,本实例就是利用Map集合实现了省市级联选择框,当选择省份信息时, ...

随机推荐

  1. 使用keepalived使用主备热备份功能

    图: 配置文件: 主服务器的配置如下: global_defs { router_id NodeA}vrrp_instance VI_1 { state MASTER #设置为主服务器 interfa ...

  2. win10 uwp MVVM入门

    MVVM 是一个强大的架构,基本从 WPF 开始,wr(我说的就是微软)就提倡使用 MVVM.它可以将界面和后台分离,让开发人员可以不关心界面是怎样,全心投入到后台代码编写中. 然后在编写完后台代码后 ...

  3. vs2012建一个空解决方案添加以前老版本的Web项目调试弹出window安全

    解决方法:NTLM身份验证去掉就行.

  4. [译]ASP.NET Core 2.0 全局配置项

    问题 如何在 ASP.NET Core 2.0 应用程序中读取全局配置项? 答案 首先新建一个空项目,并添加两个配置文件: 1. appsettings.json { "Section1&q ...

  5. CURL常用命令记录--用于简单测试接口

    curl命令是一个利用URL规则在命令行下工作的文件传输工具.它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具.作为一款强力工具,curl支持包括HTTP.HTTPS.f ...

  6. (转)利用JConsole工具监控java程序内存和JVM

    转自:http://www.cnblogs.com/luihengk/p/5446279.html 一.找到java应用程序对应的进程PI 性能测试应用程序访问地址:http://192.168.29 ...

  7. 【ASP.NET MVC 学习笔记】- 03 Razor语法

    本文参考:http://www.cnblogs.com/willick/p/3224144.html 1.Razor语句以@开头. 2.每个View都有自己的Model属性,可通过@Model调用.语 ...

  8. IDEA + Maven + JavaWeb项目搭建

    前言:在网上一直没找到一个完整的IDEA+Maven+Web项目搭建,对于IDEA和Maven初学者来说,这个过程简单但是非常痛苦的,对中间的某些步骤不是很理解,导致操作错误,从而项目发布不成功,一直 ...

  9. java传值与传引用总结

    基本数据类型 我们先来看一个代码 public class ParamTest { public static void main(String[] arge) { double percent = ...

  10. angular 1.5.3各种模块使用(一)

    1.angular cookie的用法:(1)引入angular-cookies(2)注入ngCookies这模块(3)想要更改cookies存储位置的话要添加内置服务$cookiesProvider ...