HashMap 排序
本文章,摘抄自:2018黑马程序最新面试题汇总
已知一个 HashMap<Integer,User>集合, User 有 name(String)和 age(int)属性。请写一个方法实现对HashMap 的排序功能,该方法接收 HashMap<Integer,User>为形参,返回类型为 HashMap<Integer,User>,
要求对 HashMap 中的 User 的 age 倒序进行排序。排序时 key=value 键值对不得拆散。注意:要做出这道题必须对集合的体系结构非常的熟悉。HashMap 本身就是不可排序的,但是该道题偏偏让给 HashMap 排序,那我们就得想在API 中有没有这样的 Map 结构是有序的,LinkedHashMap,对的,就是他,他是 Map 结构,也是链表结构,有序的,更可喜的是他是HashMap 的子类,我们返回 LinkedHashMap<Integer,User> 即可,还符合面向接口(父类编程的思想)。
但凡是对集合的操作,我们应该保持一个原则就是能用 JDK 中的 API 就有 JDK 中的 API,比如排序算法我们不应
该去用冒泡或者选择,而是首先想到用 Collections 集合工具类。
public class HashMapSort {
public static void main(String[] args) {
HashMap<Integer, User> users = new HashMap<>();
users.put(, new User("张三", ));
users.put(, new User("李四", ));
users.put(, new User("王五", ));
Set<Integer> sets = users.keySet();
System.out.println("排序前:");
for (Integer integer : sets) {
System.out.println(integer + ":" + users.get(integer));
}
System.out.println("排序后:");
HashMap<Integer, User> sortHashMap = sortHashMap(users);
Set<Integer> sets2 = sortHashMap.keySet();
for (Integer integer : sets2) {
System.out.println(integer + ":" + sortHashMap.get(integer));
}
}
public static HashMap<Integer, User> sortHashMap(HashMap<Integer, User> map) {
// 首先拿到map的键值对集合
Set<Entry<Integer, User>> entrySet = map.entrySet();
// 将set集合转为List集合,为什么?为了使用工具类的排序方法
List<Entry<Integer, User>> list = new ArrayList<>(entrySet);
// 使用collections集合工具类对list进行排序,排序规则使用匿名内部类来实现
Collections.sort(list, new Comparator<Entry<Integer, User>>() {
@Override
public int compare(Entry<Integer, User> o1, Entry<Integer, User> o2) {
// 按要求根据User的age的倒序进行排
return o2.getValue().getAge() - o1.getValue().getAge();
}
});
// 创建一个新的有序的HashMap子类的集合
LinkedHashMap<Integer, User> linkedHashMap = new LinkedHashMap<>();
// 将list中的数据存储在LinkedHashMap中
for (Entry<Integer, User> entry : list) {
linkedHashMap.put(entry.getKey(), entry.getValue());
}
// 返回结果
return linkedHashMap;
}
}
public class User {
private String name;
private Integer age;
public User(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
执行结果:
排序前:
1:User [name=张三, age=25]
2:User [name=李四, age=20]
3:User [name=王五, age=30]
排序后:
3:User [name=王五, age=30]
1:User [name=张三, age=25]
2:User [name=李四, age=20]
HashMap 排序的更多相关文章
- HashMap排序的问题
那么已知一个HashMap<Integer,User>集合, User有name(String)和 age(int)属性.请写一个方法实现对HashMap 的排序功能,该方法接收 Hash ...
- 给HashMap排序,使之成为有序Map
如何给HashMap中的值排序?这个问题很多人都遇到过,很常见的一个方案是使用LinkedHashMap,因为LinkedHashMap可以记住元素放入的顺序,可以认为是真正的“有序”(想让HashM ...
- Map HashMap 排序 迭代循环 修改值
HashMap dgzhMap = Dict.getDict("dgzh"); Iterator it_d = dgzhMap.entrySet().iterator(); whi ...
- Java零基础手把手系列:HashMap排序方法一网打尽
HashMap的排序在一开始学习Java的时候,比较容易晕,今天总结了一些常见的方法,一网打尽.HashMap的排序入门,看这篇文章就够了. 1. 概述 本文排序HashMap的键(key)和值(va ...
- Java中HashMap排序
注: 转载于 http://www.cnblogs.com/xingyun/archive/2012/12/09/2809962.html package com.holdobject; import ...
- java中hashMap的排序
hashMap排序,示例: private void test(){ Map<String, List<String>> unSupportedDatesMap=new Has ...
- HashMap<Integer, Bean> 根据Bean的属性进行排序
转载地址 已知一个HashMap<Integer,User>集合, User有name(String)和age(int)属性.请写一个方法实现对HashMap的排序功能,该方法接收Hash ...
- Java List/HashSet/HashMap的排序
在对Java无序类集合,如List(ArrayList/LinkedList).HashSet(TreeSet有序).HashMap等排序时,Java中一个公共的类Collections,提供了对Ja ...
- HashMap根据value值排序
)))); Set<Map.Entry<String, Integer>> entrySet = map.entrySet(); for (Map.Entry s : entr ...
随机推荐
- ELK(ElasticSearch, Logstash, Kibana) v5.3.2 分布式日志收集分析最佳解决方案 基于CentOS 7 ( 一 )
[root@localhost temp]# .tar.gz -C /usr/local/ [root@localhost temp]# vim logstatsh_test.conf ======= ...
- (转)yi_meng linux 下 ifcfg-eth0 配置 以及ifconfig、ifup、ifdown区别
linux 下 ifcfg-eth0 配置 以及ifconfig.ifup.ifdown区别 原文:https://www.cnblogs.com/yi-meng/p/3214471.html这3个命 ...
- Reactor Pattern and Non-blocking IO--reference
reference from:http://www.cs.bgu.ac.il/~spl051/Personal_material/Practical_sessions/Ps_12/ps12.html ...
- 《敏捷软件开发:原则、模式与实践(C#版)》源代码下载
Agile Software Development: Principles, Patterns and Practice (C# Edition) Source Code 这本书的经典性无需多言 ...
- a href="javascript:"与a href="#"
<a href="javascript:;"></a> <a href="#"></a> 这两种写法.这两种写法 ...
- HTTPS与SSL(一)
1. HTTPS HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版 ...
- Mono for Android 设计器错误:Disconnected from layout renderer
今早打开vs2012 android 项目的时候出现如下错误提示: 查了半天,终于在官方网站得到答案.(http://forums.xamarin.com/discussion/143 ...
- Git 推送和删除标签
事实上Git 的推送和删除远程标签命令是相同的,删除操作实际上就是推送空的源标签refs:git push origin 标签名相当于git push origin refs/tags/源标签名:re ...
- COGS 1191. [Tyvj Feb11] 猫咪的进化
★ 输入文件:neko.in 输出文件:neko.out 简单对比时间限制:1 s 内存限制:128 MB [背景] 对于一只猫咪来说,它是有九条命的.但是并不是所有的猫咪都是这样,只 ...
- 兼容ie8的圆形进度条
主要是利用html5中的svg 画出圆形进度条 并且兼容ie8 https://github.com/GainLoss/Circular-progress-bar