Java面试题:如何对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,并插入一些键和值。
ap<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> ele1,
Entry<String, Integer> ele2) {
return ele1.getValue().compareTo(ele2.getValue());
}
});
6.使用自定义比较器,基于entry的值(Entry.getValue()),来排序链表。
7. ele1.getValue(). compareTo(ele2.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.完整的代码如下。
package com.speakingcs.maps; import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; 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<Entry<String,Integer>>(mapEntries); // sorting the List
Collections.sort(aList, new Comparator<Entry<String,Integer>>() { @Override
public 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("Value " + " - " + "Key");
for(Entry<String,Integer> entry : aMap2.entrySet()) {
System.out.println(entry.getValue() + " - " + entry.getKey());
} }
}
Java面试题:如何对HashMap按键值排序的更多相关文章
- 如何对HashMap按键值排序
Java中HashMap是一种用于存储“键”和“值”信息对的数据结构.不同于Array.ArrayList和LinkedLists,它不会维持插入元素的顺序. 因此,在键或值的基础上排序HashMap ...
- 【Java面试题】33 HashMap和Hashtable的区别
1 HashMap不是线程安全的 hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值.HashMap允许null key和n ...
- java面试题之为什么hashmap的数组初始化大小都是2的N次方?
当数组长度为2的N次方时,不同的key算出的index相同的几率小,数据在数组上分配均匀,hash碰撞的几率小,提升查询效率,从大O(N)提升至O(1):
- java算法面试题:有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数 按值的降序排序,如果值相同则按键值的字母顺序
package com.swift; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; publi ...
- 阿里腾讯校招Java面试题总结及答案
阿里校招java面试题汇总 1.HashMap和HashTable的区别,及其实现原理. Hashtable继承自Dictionary类,而HashMap是Java1.2引进的,继承自Abstract ...
- [Java集合] 彻底搞懂HashMap,HashTable,ConcurrentHashMap之关联.
注: 今天看到的一篇讲hashMap,hashTable,concurrentHashMap很透彻的一篇文章, 感谢原作者的分享. 原文地址: http://blog.csdn.net/zhanger ...
- 【转载】关于Java String, StringBuilder, StringBuffer, Hashtable, HashMap的面试题
REF: http://blog.csdn.net/fightforyourdream/article/details/15333405 题目是一道简单的小程序,像下面这样:[java] view p ...
- Java面试题之HashMap阿里面试必问知识点,你会吗?
面试官Q1:你用过HashMap,你能跟我说说它的数据结构吗? HashMap作为一种容器类型,无论你是否了解过其内部的实现原理,它的大名已经频频出现在各种互联网Java面试题中了.从基本的使用角度来 ...
- java面试题——HashMap和Hashtable 的区别
一.HashMap 和Hashtable 的区别 我们先看2个类的定义 public class Hashtable extends Dictionary implements Map, Clonea ...
随机推荐
- Spring Boot 中配置切换
步骤一:切换需求 有时候在本地测试是使用8080端口(默认端口),可是上线时使用的比如是9090端口(不常用的,以防被黑). 此时就可以通过多配置文件实现多配置支持与灵活切换. 步骤二:多配置文件 3 ...
- Windows7中pagefil.sys和Hiberfil.sys文件删除与转移
第一步.在开始的功能表的搜索栏里输入 cmd,然后在搜索结果中的 cmd 按下右键,点选[以系统管理员身分运行] 第二步.在命令提示符窗口里输入下面命令然后按下Enter: powercfg –h o ...
- 在NLP中深度学习模型何时需要树形结构?
在NLP中深度学习模型何时需要树形结构? 前段时间阅读了Jiwei Li等人[1]在EMNLP2015上发表的论文<When Are Tree Structures Necessary for ...
- PlusOne
问题描述:一个数组每一位代表一个数字的每一位.数字高位在数组的低位.求数字加1后得到新数组. 算法分析:要从数组的高位到低位进行遍历. public class PlusOne { public in ...
- hdu 5776 sum 前缀和
sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submi ...
- Mac系统下安装ipython分别支持python2和python3
操作系统:Mac10.11.5 python2.7.13 python3.6.1 安装python2: brew install python 安装python3: brew install pyth ...
- java Graphics2d消除锯齿,使字体平滑显示
Java 2D API 提供的文本处理功能进行美化.Java 2D API 的文本功能包括: 使用抗锯齿处理和微调(hinting)以达到更好的输出质量 可以使用系统安装的所有字体 可以将对图形对象的 ...
- spring3: 基于Schema的AOP
6.3 基于Schema的AOP 基于Schema的AOP从Spring2.0之后通过“aop”命名空间来定义切面.切入点及声明通知. 在Spring配置文件中,所以AOP相关定义必须放在<a ...
- android开发环境:使用Android Studio搭建Android集成开发环境(图文教程)
开发环境情况: 物理机版本:Win 7旗舰版(64位) Java SDK版本:jdk1.8.0_25(64位) Android SDK版本:Android 7.1(API 25) Android St ...
- c#的DateTime.Now详解
(转自:http://www.cnblogs.com/lida/archive/2011/01/02/1924197.html) //2008年4月24日 System.DateTime.Now.To ...