Java提高(5)---map集合排序
map集合排序
这篇文章讲的不仅仅是map排序,比如把对象按某一属性排序,它都可以解决这些问题。
比如,有N个对象,每个对象有个属性就是成绩,成绩分:优秀,良好,合格。那我们如何按照成绩的好坏进行排序呢,下面请看代码。
1.people对象
package com.test;
/*people对象其实很简单,就提供了三个属性*/
class People {
private String Name; //姓名
private String Score; //成绩
private String id; //学号
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getScore() {
return Score;
}
public void setScore(String score) {
Score = score;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public People(String name, String score, String id) {
super();
Name = name;
Score = score;
this.id = id;
}
}
2.主要方法
package com.test; import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap; /**
* Map进行多条件排序输出
* 成绩具有优秀,合格,不合格好吃属性。
* 入口Map
* 首先按照优秀,合格,不合格排序
* 然后按照人名的标志Id排序
* 出口Map
*
*
*/
public class MainSort { /**
* 准备参数,创建对象
* @return
*/
private static Map<String, People> getPeopleMap() {
Map<String,People> PeopleMap = new TreeMap<>(); // 创建对象
People b = new People("小明" , "优秀", "b");
People a = new People("小红" , "合格", "a");
People c = new People("丁丁" , "合格", "c");
People d = new People("冬冬" , "良好", "d");
People e = new People("小黄" , "优秀", "e");
People f = new People("小李" , "良好", "f");
People g = new People("小钟" , "优秀", "g"); // 添加乱序key值,把对象放入map集合
PeopleMap.put("xniem", b);
PeopleMap.put("akjd", a);
PeopleMap.put("uioo", c);
PeopleMap.put("qw84", d);
PeopleMap.put("584sdf'", e);
PeopleMap.put("4aisdf", f);
PeopleMap.put("458jsf", g); return PeopleMap;
} /**
* 循环打印Map
*/
private static void show(Map<String, People> PeopleMap) {
// 循环Map 这个打印肯定是无序的,也不是按放入的先后顺序
for (Map.Entry<String, People> PeopleOneMap : PeopleMap.entrySet()) {
People People = PeopleOneMap.getValue();
System.out.println(People.getName() + " " + People.getScore()+ " " + People.getId() );
}
} /*
* 由于List能够直接使用Collections进行排序
* 但是Map不行。
* 这边所做的操作就是先将Map--》List
* 然后对List进行排序
* 然后在讲List--》转换成LinkedHashMap
*
*/
public static Map<String, People> sortMapByValue(Map<String, People> PeopleMap) {
if (PeopleMap == null || PeopleMap.isEmpty()) {
return null;
}
// LinkedHashMap是有序的、或者TreeMap都是有序的(这里只能用LinkedHashMap)
Map<String, People> sortedMap = new LinkedHashMap<String, People>(); /* Set set=PeopleMap.entrySet(); PeopleMap.entrySet()返回的是一个set集合
* 再讲ArrayList(Collection<? extends E> c) 可以放collection,set集合是其子类,map不行哦
* 这步就是把map集合转为ArrayList集合
*/ List<Map.Entry<String, People>> entryList = new ArrayList<Map.Entry<String, People>>(PeopleMap.entrySet()); //这步是关键,进过这步之后,entryList已经是个有序的ArrayList集合了
Collections.sort(entryList, new MapValueComparator());
//通过迭代器取出
Iterator<Map.Entry<String, People>> iter = entryList.iterator();
// Map.Entry<String, People>,就是包装了一个map节点,这个节点封装了key,value值,以及别的值(比如hashmap中哈希码和next指针)
Map.Entry<String, People> tmpEntry = null;
while (iter.hasNext()) {
tmpEntry = iter.next();
sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());
}
return sortedMap;
} /**
* 主方法
*
*/
public static void main(String[] args) {
// 获取Map
Map<String,People> PeopleMap = getPeopleMap();
// 打印未排序的Map
show(PeopleMap);
System.out.println("-----------before-----------");
// 打印排序完了的Map
show(MainSort.sortMapByValue(PeopleMap));
System.out.println("-----------after------------");
}
}
3.Comparator方法
package com.test; import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry; class MapValueComparator implements Comparator<Map.Entry<String, People>> { @Override
public int compare(Entry<String, People> o1, Entry<String, People> o2) { // 获取比较的两个对象
People People1 = o1.getValue();
People People2 = o2.getValue(); // 将成绩映射成具有比较关系的字符1、2、3
Map<String,Integer> tasteLev = new HashMap<>();
tasteLev.put("优秀", 1);
tasteLev.put("良好", 2);
tasteLev.put("合格", 3); int cr = 0;
// 判断成绩
int a = tasteLev.get(People2.getScore())-tasteLev.get(People1.getScore());
if (a!=0) {
cr = (a>0) ? -1 : 2;
} else { /*其实上面就可以按成绩优秀,良好,合格排序了,
*在做一步目的,就是在成绩相同的情况下,在按照学号进行排序
*/ // 按照对应的Id排序
a = People2.getId().compareTo(People1.getId());
if (a!=0) {
cr = (a>0)? -2 : 1;
}
}
/* 注意上面对一个返回值对应的就是形成比较层次
* 上层
* --> 2
* --> -1
* 下层
* --> 1
* --> -2
*/
return cr;
}
}
最后我们再来看后台输出

Java提高(5)---map集合排序的更多相关文章
- 【Java进阶】---map集合排序
map集合排序 这篇文章讲的不仅仅是map排序,比如把对象按某一属性排序,它都可以解决这些问题. 比如,有N个对象,每个对象有个属性就是成绩,成绩分:优秀,良好,合格.那我们如何按 ...
- map集合排序
默认情况下,HashMap.HashTable.TreeMap.LinkedHashMap的排列顺序比较: package com.per.sdg.demo; import java.util.Has ...
- 黑马程序员——JAVA基础之Map集合
------- android培训.java培训.期待与您交流! ---------- Map集合: 该集合存储键值对.一对一对往里存.而且要保证键的唯一性. 和Set很像,其实Set底层就是使用了M ...
- java8新特性:对map集合排序
一.简单介绍Map 在讲解Map排序之前,我们先来稍微了解下map,map是键值对的集合接口,它的实现类主要包括:HashMap, TreeMap, Hashtable以及LinkedHashMap等 ...
- java如何对map进行排序详解(map集合的使用)
今天做统计时需要对X轴的地区按照地区代码(areaCode)进行排序,由于在构建XMLData使用的map来进行数据统计的,所以在统计过程中就需要对map进行排序. 一.简单介绍Map 在讲解Map排 ...
- Java Collection、Map集合总结
1.Java中的Collection集合总结 Collection |---List(存储有序,可重复) |---ArrayList 底层数据结构是数组,查询快,增删慢. 线程不安全.效率高 |--- ...
- java中的Map集合
Map接口 Map为一个接口.实现Map接口的类都有一个特点:有键值对,将键映射到值的对象. Map不能包含重复的键,每个键可以映射到最多一个值. Map常见的接口方法有: V put(K key, ...
- Java——倒序输出Map集合
package com.java.test.a; import java.util.ArrayList; import java.util.LinkedHashMap; import java.uti ...
- Java中遍历Map集合的四种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...
随机推荐
- java中产生HttpServletRequest等作用域
protected ServletContext getServletContext() { return ServletActionContext.getServletContext();} pro ...
- 1179: 零起点学算法86——小明A+B(未弄懂)
1179: 零起点学算法86——小明A+B Time Limit: 1 Sec Memory Limit: 32 MB 64bit IO Format: %lldSubmitted: 2540 ...
- require.js模块化
require.js简单来说就是把js代码分装模块化了 模块化 模块就是实现特定功能的一组方法.只要把不同的函数(以及记录状态的变量)简单地放在一起,就算是一个模块. 我拿一个运动框架来解释一下req ...
- mysql中gbk_chinese_ci与gbk_bin区别
如果在query browser中选create new table在字符集的选择中collation栏有两个选择gbk_chinese_ci与gbk_bin gbk_bin是二进制存储.区分大小写的 ...
- Failed to mount component: template or render function not defined.
Failed to mount component: template or render function not defined. vue-loader13.0有一个变更就是默认启用了esModu ...
- Codeforces 1120 简要题解
文章目录 A题 B题 C题 D题 E题 F题 传送门 A题 传送门 题意简述:给你一个mmm个数的数列,现在规定把一个数列的1,2,...,k1,2,...,k1,2,...,k分成第一组,把k+1, ...
- 编程感悟-建立好代码sop
1.最近学django和python,发现很多的函数记不住,这时候我百度了一下,发现记不住是程序员的正常情况, 这下心安理得多了,记好笔记和咱的sop吧,会很快. 社会是不是也这样,好多东西也记不住, ...
- 20155205 郝博雅 Exp5 MSF基础应用
20155205 郝博雅 Exp5 MSF基础应用 一.实验目标 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.一个主动攻击实践,如ms08_0 ...
- mvc 路由伪静态实现
很多网站都采用伪静态,例如以html.shtml等结尾的url,mvc的路由可以轻松实现. 配置路由 默认路由配置 添加伪静态路由 mvc的路由原理是从上往下匹配的,所以只需要在后面添加自己配置的路由 ...
- 《DevOps软件架构师行动指南》读后感
从软件架构师视角讲解了引入DevOps实践所需要拥有的技术能力,涵盖运维.部署流水线.监控.安全与审计以及质量关注,这是本书一开始内容简介的开头,本书的作者是伦恩·拜斯(Len Bass).英戈·韦伯 ...