如何对HashMap按键值排序
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按键值排序相关推荐
- java的hashmap排序_Java面试题:如何对HashMap按键值排序
Java中HashMap是一种用于存储"键"和"值"信息对的数据结构.不同于Array.ArrayList和LinkedLists,它不会维持插入元素的顺序. ...
- python字典按键值排序_在Python中按键或值按升序和降序对字典排序
python字典按键值排序 Problem Statement: Write a Python program to sort (ascending and descending) a diction ...
- 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 ...
- python字典按键值排序_Python字典『键 值』排序
假设有一个字符串,然后想要查一下每个字母出现了多少次,可以通过字典来实现,实现方法? 用了get方法,来编写一下histogram这个函数,去掉那些if语句,更简洁一下: def histogram( ...
- python中字典按键或键值排序
字典排序 在程序中使用字典进行数据信息统计时,由于字典是无序的所以打印字典时内容也是无序的.因此,为了使统计得到的结果更方便查看需要进行排序.Python中字典的排序分为按"键"排 ...
- python中字典按键或键值排序_[宜配屋]听图阁
字典排序 在程序中使用字典进行数据信息统计时,由于字典是无序的所以打印字典时内容也是无序的.因此,为了使统计得到的结果更方便查看需要进行排序.Python中字典的排序分为按"键"排 ...
- python 字典 按值排序贺按键排序 得到一个新字典
问题背景 统计英文文章中单词的频率,得到之后呢,我不仅想让看到从 a 开头到 z 开头的数据,我还想看到出现频次从高到低的数据,所以有了这篇文章, 初步知识 sorted 函数 sorted(iter ...
- python dict排序_python 字典(dict)按键和值排序
python 字典(dict)的特点就是无序的,按照键(key)来提取相应值(value),如果我们需要字典按值排序的话,那可以用下面的方法来进行: 1 下面的是按照value的值从大到小的顺序来排序 ...
- 【python】字典按键、按值排序
全文一览 一.按键排序 1.1 思路解析 1.2 方法总结 二.按值排序 2.1 思路解析 2.1.1 生成键值对元组列表 2.1.2 对键值对元组列表排序 2.1.3 根据列表生成字典 2.2 方法 ...
最新文章
- Win7旗舰版系统右键菜单响应速度很慢会延迟一段时间
- migration vmware vms to openstack kvm 修改vmware windows scsi to ide
- 面试:知道 CopyOnWriteArrayList 吗?
- Quartz 框架快速入门(四)
- 全球及中国嵌入式家电行业销售格局及竞争策略研究报告2021-2027年版
- const在c中的用法
- 工业互联网白皮书_发布|《工业互联网平台安全白皮书(2020)》发布
- java 多线程跑数据_java——多线程的实现方式、三种办法解决线程赛跑、多线程数据同步(synchronized)、死锁...
- java内存加载dll_jacob调用dll控件,是否要执行内存释放,具体方法怎么写
- 关于asp.net利用mono部署到Linux上的一些说明
- 央视消息 | 没考驾照的人可能要恭喜了!
- 更新SQL Server实例所有数据库表统计信息
- 统一资源管理与调度平台(系统)介绍
- 如何开发与设计一个爆款小游戏
- 【编译原理笔记02】计算机如何表示语言及其文法,字母表(及其运算)、串、推导和归约、句型和句子、文法分析树
- Java排序算法(四):Shell排序
- 安防蓝海带来亿万商机 汉王人脸通掀起产业风暴
- ORA-01045: user lacks CREATE SESSION privilege; logon denied
- 2020 东京奥运会直播/回放观看途径
- TFS映射关系出错的几种
热门文章
- 基于混合整数二阶锥(MISOCP)的配电网重构(附matlab代码)
- 持续交付之基于Git Flow代码分支策略实践
- 计算机学院单片机毕设,单片机毕业设计完整版.pdf
- 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 8000401a 因为配置标识不正确...
- 最受欢迎的大数据可视化软件
- 海量点云数据快速读取方法
- 启动速度与执行效率优化项目实战(五):Systrace与TraceView工具
- Python3趣味系列题1------回溯暴力解决数独问题
- js 三角形质心计算
- vrep结合centerOfMassVisualization tool得到机器人质心坐标