Java中HashMap是一种用于存储“键”和“值”信息对的数据结构。不同于Array、ArrayList和LinkedLists,它不会维持插入元素的顺序。

因此,在键或值的基础上排序HashMap是一个很难的问题,如果你不知道如何解决的话。下面让我们看看如何解决这个问题。

1.HashMap存储每对键和值作为一个Entry<K,V>对象。例如,给出一个HashMap,

Map<String,Integer> aMap = new HashMap<String,Integer>();

键的每次插入,都会有值对应到散列映射上,生成一个Entry <K,V>对象。通过使用这个Entry <K,V>对象,我们可以根据值来排序HashMap。
 
2.创建一个简单的HashMap,并插入一些键和值。

Map<String,Integer> aMap = new HashMap<String,Integer>();
// adding keys and values
aMap.put("Five", 5);
aMap.put("Seven", 7);
aMap.put("Eight", 8);
aMap.put("One",1);
aMap.put("Two",2);
aMap.put("Three", 3);

3.从HashMap恢复entry集合,如下所示。

Set<Entry<String,Integer>> mapEntries = aMap.entrySet();

4.从上述mapEntries创建LinkedList。我们将排序这个链表来解决顺序问题。我们之所以要使用链表来实现这个目的,是因为在链表中插入元素比数组列表更快。

List<Entry<String,Integer>> aList = new LinkedList<Entry<String,Integer>>(mapEntries);

5.通过传递链表和自定义比较器来使用Collections.sort()方法排序链表。

Collections.sort(aList, new Comparator<Entry<String,Integer>>() {@Override            public int compare(Entry<String, Integer> e1, Entry<String, Integer> e2) {return e1.getValue().compareTo(e2.getValue());}
});

6.使用自定义比较器,基于entry的值(Entry.getValue()),来排序链表。
 
7. e1.getValue(). compareTo(e2.getValue())——比较这两个值

  • 返回 0 ——如果这两个值完全相同的话;
  • 返回 1 ——如果第一个值大于第二个值;
  • 返回 -1 ——如果第一个值小于第二个值。

8.Collections.sort()是一个内置方法,仅排序值的列表。它在Collections类中重载。这两种个方法是

public static <T extends Comparable<? super T>> void sort(List<T> list)public static <T> void sort(List<T> list, Comparator<? super T> c)

9.现在你已经排序链表,我们需要存储键和值信息对到新的映射中。由于HashMap不保持顺序,因此我们要使用LinkedHashMap。

// Storing the list into Linked HashMap to preserve the order of insertion.
Map<String,Integer> aMap2 = new LinkedHashMap<String, Integer>();
for(Entry<String,Integer> entry: aList) {aMap2.put(entry.getKey(), entry.getValue());
}

10.完整的代码如下。

import java.util.*;public class SortMapByValues {public static void main(String[] args) {Map<String,Integer> aMap = new HashMap<String,Integer>();// adding keys and values        aMap.put("Five", 5);aMap.put("Seven", 7);aMap.put("Eight", 8);aMap.put("One",1);aMap.put("Two",2);aMap.put("Three", 3);sortMapByValues(aMap);}private static void sortMapByValues(Map<String, Integer> aMap) {Set<Entry<String,Integer>> mapEntries = aMap.entrySet();System.out.println("Values and Keys before sorting ");for(Entry<String,Integer> entry : mapEntries) {System.out.println(entry.getValue() + " - "+ entry.getKey());}// used linked list to sort, because insertion of elements in linked list is faster than an array list.         List<Entry<String,Integer>> aList = new LinkedList<>(mapEntries);// sorting the List        Collections.sort(aList, new Comparator<Entry<String,Integer>>() {@Overridepublic int compare(Entry<String, Integer> ele1, Entry<String, Integer> ele2) {return ele1.getValue().compareTo(ele2.getValue());}});// Storing the list into Linked HashMap to preserve the order of insertion.Map<String,Integer> aMap2 = new LinkedHashMap<String, Integer>();for(Entry<String,Integer> entry: aList) {aMap2.put(entry.getKey(), entry.getValue());}// printing values after soring of map        System.out.println("Values and Keys after sorting ");for(Entry<String,Integer> entry : aMap2.entrySet()) {System.out.println(entry.getValue() + " - " + entry.getKey());}}
}

本文整理自:慕课网——喵喔喔

如何对HashMap按键值排序相关推荐

  1. java的hashmap排序_Java面试题:如何对HashMap按键值排序

    Java中HashMap是一种用于存储"键"和"值"信息对的数据结构.不同于Array.ArrayList和LinkedLists,它不会维持插入元素的顺序. ...

  2. python字典按键值排序_在Python中按键或值按升序和降序对字典排序

    python字典按键值排序 Problem Statement: Write a Python program to sort (ascending and descending) a diction ...

  3. Python 字典创建、更新、按键值排序、取最大键值对等操作

    1. 字典创建 In [1]: d = {}In [2]: d Out[2]: {}In [3]: d = dict()In [4]: d Out[4]: {}In [5]: dict(a=1,b=2 ...

  4. python字典按键值排序_Python字典『键 值』排序

    假设有一个字符串,然后想要查一下每个字母出现了多少次,可以通过字典来实现,实现方法? 用了get方法,来编写一下histogram这个函数,去掉那些if语句,更简洁一下: def histogram( ...

  5. python中字典按键或键值排序

    字典排序 在程序中使用字典进行数据信息统计时,由于字典是无序的所以打印字典时内容也是无序的.因此,为了使统计得到的结果更方便查看需要进行排序.Python中字典的排序分为按"键"排 ...

  6. python中字典按键或键值排序_[宜配屋]听图阁

    字典排序 在程序中使用字典进行数据信息统计时,由于字典是无序的所以打印字典时内容也是无序的.因此,为了使统计得到的结果更方便查看需要进行排序.Python中字典的排序分为按"键"排 ...

  7. python 字典 按值排序贺按键排序 得到一个新字典

    问题背景 统计英文文章中单词的频率,得到之后呢,我不仅想让看到从 a 开头到 z 开头的数据,我还想看到出现频次从高到低的数据,所以有了这篇文章, 初步知识 sorted 函数 sorted(iter ...

  8. python dict排序_python 字典(dict)按键和值排序

    python 字典(dict)的特点就是无序的,按照键(key)来提取相应值(value),如果我们需要字典按值排序的话,那可以用下面的方法来进行: 1 下面的是按照value的值从大到小的顺序来排序 ...

  9. 【python】字典按键、按值排序

    全文一览 一.按键排序 1.1 思路解析 1.2 方法总结 二.按值排序 2.1 思路解析 2.1.1 生成键值对元组列表 2.1.2 对键值对元组列表排序 2.1.3 根据列表生成字典 2.2 方法 ...

最新文章

  1. Win7旗舰版系统右键菜单响应速度很慢会延迟一段时间
  2. migration vmware vms to openstack kvm 修改vmware windows scsi to ide
  3. 面试:知道 CopyOnWriteArrayList 吗?
  4. Quartz 框架快速入门(四)
  5. 全球及中国嵌入式家电行业销售格局及竞争策略研究报告2021-2027年版
  6. const在c中的用法
  7. 工业互联网白皮书_发布|《工业互联网平台安全白皮书(2020)》发布
  8. java 多线程跑数据_java——多线程的实现方式、三种办法解决线程赛跑、多线程数据同步(synchronized)、死锁...
  9. java内存加载dll_jacob调用dll控件,是否要执行内存释放,具体方法怎么写
  10. 关于asp.net利用mono部署到Linux上的一些说明
  11. 央视消息 | 没考驾照的人可能要恭喜了!
  12. 更新SQL Server实例所有数据库表统计信息
  13. 统一资源管理与调度平台(系统)介绍
  14. 如何开发与设计一个爆款小游戏
  15. 【编译原理笔记02】计算机如何表示语言及其文法,字母表(及其运算)、串、推导和归约、句型和句子、文法分析树
  16. Java排序算法(四):Shell排序
  17. 安防蓝海带来亿万商机 汉王人脸通掀起产业风暴
  18. ORA-01045: user lacks CREATE SESSION privilege; logon denied
  19. 2020 东京奥运会直播/回放观看途径
  20. TFS映射关系出错的几种

热门文章

  1. 基于混合整数二阶锥(MISOCP)的配电网重构(附matlab代码)
  2. 持续交付之基于Git Flow代码分支策略实践
  3. 计算机学院单片机毕设,单片机毕业设计完整版.pdf
  4. 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 8000401a 因为配置标识不正确...
  5. 最受欢迎的大数据可视化软件
  6. 海量点云数据快速读取方法
  7. 启动速度与执行效率优化项目实战(五):Systrace与TraceView工具
  8. Python3趣味系列题1------回溯暴力解决数独问题
  9. js 三角形质心计算
  10. vrep结合centerOfMassVisualization tool得到机器人质心坐标