【Java进阶】---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进阶】---map集合排序的更多相关文章
- Java提高(5)---map集合排序
map集合排序 这篇文章讲的不仅仅是map排序,比如把对象按某一属性排序,它都可以解决这些问题. 比如,有N个对象,每个对象有个属性就是成绩,成绩分:优秀,良好,合格.那我们如何按照成绩的好坏进行排序 ...
- java基础-Map集合
java基础-Map集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Map集合概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它 ...
- map集合排序
默认情况下,HashMap.HashTable.TreeMap.LinkedHashMap的排列顺序比较: package com.per.sdg.demo; import java.util.Has ...
- java8新特性:对map集合排序
一.简单介绍Map 在讲解Map排序之前,我们先来稍微了解下map,map是键值对的集合接口,它的实现类主要包括:HashMap, TreeMap, Hashtable以及LinkedHashMap等 ...
- Java基础知识:Java实现Map集合二级联动1
Java实现Map集合二级联动 Map集合可以保存键值映射关系,这非常适合本实例所需要的数据结构,所有省份信息可以保存为Map集合的键,而每个键可以保存对应的城市信息,本实例就是利用Map集合实现了省 ...
- Java基础操作面试题:Map集合排序 需要TreeMap 构造方法参数有比较器 输入字符串,统计A、B、C、D、出现次数,由高到低输出字母和出现次数,使用Map集合完成此题
Map和Collections是同级别的,不能像List排序那样直接用Collections.sort(new Comparator<?>(){ 复写compara方法}); HashMa ...
- java中Map集合的理解
Map |--Hashtable:底层是哈希表数据结构,不可以存入null键null值.该集合是线程同步的.jdk1.0.效率低. |--HashMap:底层是哈希表数据结构,允许使用 null 值和 ...
- java中map集合的迭代
import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class TestMap { pu ...
- Java实现Map集合二级联动
Map集合可以保存键值映射关系,这非常适合本实例所需要的数据结构,所有省份信息可以保存为Map集合的键,而每个键可以保存对应的城市信息,本实例就是利用Map集合实现了省市级联选择框,当选择省份信息时, ...
随机推荐
- Linux基础命令讲解(二)
Linux命令基本格式: 命令 [参数] [路径文件] 方括号内容可省略 查看命令帮助手段: 1 man 命令名 (man 还可以获取配置文件,函数的帮助) 2 命令 --help 3 help 命令 ...
- EasyUI Dialog 窗体 布局记要
通常在窗体里放置的都是表单,或者使用分栏(Tab)来陈列信息也是非常的好用.在这里特别记录一下在窗体里同时放置表单和表格的设计思路. 仅放置一个表单 通常 Dialog 里只放一个表单,而且表单的行数 ...
- WiFi网络WPA2 KRACK漏洞分析报告
作者:东帆@阿里安全技术平台团队 -------- 0x00 漏洞概述 安全研究员Mathy Vanhoef发现的WPA2协议的KRA(Key Reinstallation Attacks)漏洞, ...
- WPF MVVM模式的一些理解
/*本文转自 http://www.cnblogs.com/sirkevin/archive/2012/11/28/2793471.html */ 使用WPF+Mvvm开发一年多,期间由于对Mvvm模 ...
- 整理一批 国内外优秀设计团队 & 设计相关网站
设计做不好,因为看得少!这里精心整理了一批国内外优秀设计团队的官网,以及同设计相关的网站.每个网站,我都浏览了一下,确保里面真的是有干货,并且保持一定的频率正常更新. [腾讯] 腾讯社交用户体验设计 ...
- BandwagonHost搬瓦工VPS自建
地址:https://bwh1.net/aff.php?aff=18648 ,购买$2.99的就够用了(现在没有$2.99的了,最低是$4.99) 步骤一: 步骤二: 步骤三:选图中的选项,然后点 A ...
- LeetCode 442. Find All Duplicates in an Array (在数组中找到所有的重复项)
Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others ...
- 数据处理不等式:Data Processing Inequality
我是在差分隐私下看到的,新解决方案的可用性肯定小于原有解决方案的可用性,也就是说信息的后续处理只会降低所拥有的信息量. 那么如果这么说的话为什么还要做特征工程呢,这是因为该不等式有一个巨大的前提就是数 ...
- 深度学习系列 Part (2)
1. 神经网络原理 神经网络模型,是上一章节提到的典型的监督学习问题,即我们有一组输入以及对应的目标输出,求最优模型.通过最优模型,当我们有新的输入时,可以得到一个近似真实的预测输出. 我们先看一下如 ...
- 面试题----寻找比一个N位数大的“下”一个数
题目描述 写出一个算法,实现如下功能: 给定一个N位数字组成的数,找出比这个数大的由相同数字组成的下一个数 例如:如果数字为 25468, 则结果为25486 如果数字为 21765, 则结果为 25 ...