map集合排序

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.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进行排序
*
*/
public static Map<String, People> sortMapByValue(Map<String, People> PeopleMap) {
if (PeopleMap == null || PeopleMap.isEmpty()) {
return null;
}
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集合排序的更多相关文章

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集合排序

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. webdriver实用指南迁移至gitbbok并改名为selenium webdriver从入门到提高

背景 几年前我写了一本关于selenium webdriver的小册子,主要讲了一些selenium在进行测试过程中会遇到的场景以及解决方案,陆陆续续在github上收到了100+的star,在这里我 ...

2. 8天学通MongoDB——第六天 分片技术

在mongodb里面存在另一种集群,就是分片技术,跟sql server的表分区类似,我们知道当数据量达到T级别的时候,我们的磁盘,内存 就吃不消了,针对这样的场景我们该如何应对. 一:分片 mong ...

3. powerdesigner简单使用

---- 1) --- 新建流程图:新建模型,选择activity的那个就可以了. ----

4. MySql存储引擎介绍

MySQL5.5以后默认使用InnoDB存储引擎,其中InnoDB和BDB提供事务安全表,其它存储引擎都是非事务安全表.若要修改默认引擎,可以修改配置文件中的default-storage-engin ...

5. 异常-----freemarker.core.NonStringException

一,案例一 1.1.错误描述 <html> <head> <meta http-equiv="content-type" content=" ...

6. poj1321 棋盘（dfs）

#include<iostream> #include<cstring> using namespace std; ]={},sum=; ][]; void dfs(int a ...

7. hashtable 简单介绍

Hashtable 1 注意小写 table 2 常用方法 void                clear() boolean             contains(Object value) ...

8. Response.Write()方法响应导致页面字体变大的解决办法

关于ASP.NET中用Response.Write()方法响应导致页面字体变大的解决办法     最近研究了ASP.NET,发现一个问题,比方说在页面里面有个Button,要点击以后要打开新窗口,而且 ...

9. 类别不平衡问题和Softmax回归

目录 类别不平衡(class-imbalance) Softmax回归模型 类别不平衡(class-imbalance) 当不同类别的训练样本数目差别很大,则会对学习过程造成困扰.如有998个反例,但 ...

10. linux 系统监控和进程管理

1.命令top,查看cpu和内存使用,主要进程列表和占用资源. 2.内存使用命令foree -g 3.查询所有java进程:pgrep -l java     ------ps aux|grep .j ...