本文章,摘抄自: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 排序的更多相关文章

  1. HashMap排序的问题

    那么已知一个HashMap<Integer,User>集合, User有name(String)和 age(int)属性.请写一个方法实现对HashMap 的排序功能,该方法接收 Hash ...

  2. 给HashMap排序,使之成为有序Map

    如何给HashMap中的值排序?这个问题很多人都遇到过,很常见的一个方案是使用LinkedHashMap,因为LinkedHashMap可以记住元素放入的顺序,可以认为是真正的“有序”(想让HashM ...

  3. Map HashMap 排序 迭代循环 修改值

    HashMap dgzhMap = Dict.getDict("dgzh"); Iterator it_d = dgzhMap.entrySet().iterator(); whi ...

  4. Java零基础手把手系列:HashMap排序方法一网打尽

    HashMap的排序在一开始学习Java的时候,比较容易晕,今天总结了一些常见的方法,一网打尽.HashMap的排序入门,看这篇文章就够了. 1. 概述 本文排序HashMap的键(key)和值(va ...

  5. Java中HashMap排序

    注: 转载于 http://www.cnblogs.com/xingyun/archive/2012/12/09/2809962.html package com.holdobject; import ...

  6. java中hashMap的排序

    hashMap排序,示例: private void test(){ Map<String, List<String>> unSupportedDatesMap=new Has ...

  7. HashMap<Integer, Bean> 根据Bean的属性进行排序

    转载地址 已知一个HashMap<Integer,User>集合, User有name(String)和age(int)属性.请写一个方法实现对HashMap的排序功能,该方法接收Hash ...

  8. Java List/HashSet/HashMap的排序

    在对Java无序类集合,如List(ArrayList/LinkedList).HashSet(TreeSet有序).HashMap等排序时,Java中一个公共的类Collections,提供了对Ja ...

  9. HashMap根据value值排序

    )))); Set<Map.Entry<String, Integer>> entrySet = map.entrySet(); for (Map.Entry s : entr ...

随机推荐

  1. ELK(ElasticSearch, Logstash, Kibana) v5.3.2 分布式日志收集分析最佳解决方案 基于CentOS 7 ( 一 )

    [root@localhost temp]# .tar.gz -C /usr/local/ [root@localhost temp]# vim logstatsh_test.conf ======= ...

  2. (转)yi_meng linux 下 ifcfg-eth0 配置 以及ifconfig、ifup、ifdown区别

    linux 下 ifcfg-eth0 配置 以及ifconfig.ifup.ifdown区别 原文:https://www.cnblogs.com/yi-meng/p/3214471.html这3个命 ...

  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 ...

  4. 《敏捷软件开发:原则、模式与实践(C#版)》源代码下载

    Agile Software Development: Principles, Patterns and Practice (C# Edition)  Source Code 这本书的经典性无需多言 ...

  5. a href="javascript:"与a href="#"

    <a href="javascript:;"></a> <a href="#"></a> 这两种写法.这两种写法 ...

  6. HTTPS与SSL(一)

    1.  HTTPS HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版 ...

  7. Mono for Android 设计器错误:Disconnected from layout renderer

        今早打开vs2012 android 项目的时候出现如下错误提示:     查了半天,终于在官方网站得到答案.(http://forums.xamarin.com/discussion/143 ...

  8. Git 推送和删除标签

    事实上Git 的推送和删除远程标签命令是相同的,删除操作实际上就是推送空的源标签refs:git push origin 标签名相当于git push origin refs/tags/源标签名:re ...

  9. COGS 1191. [Tyvj Feb11] 猫咪的进化

    ★   输入文件:neko.in   输出文件:neko.out   简单对比时间限制:1 s   内存限制:128 MB [背景] 对于一只猫咪来说,它是有九条命的.但是并不是所有的猫咪都是这样,只 ...

  10. 兼容ie8的圆形进度条

    主要是利用html5中的svg 画出圆形进度条 并且兼容ie8 https://github.com/GainLoss/Circular-progress-bar