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

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

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

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

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

2.创建一个简单的HashMap,并插入一些键和值。

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

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

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

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

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

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

  1. Collections.sort(aList, new Comparator<Entry<String,Integer>>() {
  2.  
  3.             @Override
  4.  
  5.             public int compare(Entry<String, Integer> ele1,
  6.  
  7.                     Entry<String, Integer> ele2) {
  8.  
  9.                 return ele1.getValue().compareTo(ele2.getValue());
  10.  
  11.             }
  12.  
  13.         });

6.使用自定义比较器,基于entry的值(Entry.getValue()),来排序链表。

7. ele1.getValue(). compareTo(ele2.getValue())——比较这两个值,返回0——如果这两个值完全相同的话;返回1——如果第一个值大于第二个值;返回-1——如果第一个值小于第二个值。

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

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

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

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

10.完整的代码如下。

  1. package com.speakingcs.maps;
  2.  
  3. import java.util.Collections;
  4. import java.util.Comparator;
  5. import java.util.HashMap;
  6. import java.util.LinkedHashMap;
  7. import java.util.LinkedList;
  8. import java.util.List;
  9. import java.util.Map;
  10. import java.util.Map.Entry;
  11. import java.util.Set;
  12.  
  13. public class SortMapByValues {
  14.  
  15.     public static void main(String[] args) {
  16.  
  17.         Map<String,Integer> aMap = new HashMap<String,Integer>();
  18.  
  19.         // adding keys and values
  20.         aMap.put("Five", 5);
  21.         aMap.put("Seven", 7);
  22.         aMap.put("Eight", 8);
  23.         aMap.put("One",1);
  24.         aMap.put("Two",2);
  25.         aMap.put("Three", 3);
  26.  
  27.         sortMapByValues(aMap);
  28.  
  29.     }
  30.  
  31.     private static void sortMapByValues(Map<String, Integer> aMap) {
  32.  
  33.         Set<Entry<String,Integer>> mapEntries = aMap.entrySet();
  34.  
  35.         System.out.println("Values and Keys before sorting ");
  36.         for(Entry<String,Integer> entry : mapEntries) {
  37.             System.out.println(entry.getValue() + " - "+ entry.getKey());
  38.         }
  39.  
  40.         // used linked list to sort, because insertion of elements in linked list is faster than an array list.
  41.         List<Entry<String,Integer>> aList = new LinkedList<Entry<String,Integer>>(mapEntries);
  42.  
  43.         // sorting the List
  44.         Collections.sort(aList, new Comparator<Entry<String,Integer>>() {
  45.  
  46.             @Override
  47.             public int compare(Entry<String, Integer> ele1,
  48.                     Entry<String, Integer> ele2) {
  49.  
  50.                 return ele1.getValue().compareTo(ele2.getValue());
  51.             }
  52.         });
  53.  
  54.         // Storing the list into Linked HashMap to preserve the order of insertion.
  55.         Map<String,Integer> aMap2 = new LinkedHashMap<String, Integer>();
  56.         for(Entry<String,Integer> entry: aList) {
  57.             aMap2.put(entry.getKey(), entry.getValue());
  58.         }
  59.  
  60.         // printing values after soring of map
  61.         System.out.println("Value " + " - " + "Key");
  62.         for(Entry<String,Integer> entry : aMap2.entrySet()) {
  63.             System.out.println(entry.getValue() + " - " + entry.getKey());
  64.         }
  65.  
  66.     }
  67. }

Java面试题:如何对HashMap按键值排序的更多相关文章

  1. 如何对HashMap按键值排序

    Java中HashMap是一种用于存储“键”和“值”信息对的数据结构.不同于Array.ArrayList和LinkedLists,它不会维持插入元素的顺序. 因此,在键或值的基础上排序HashMap ...

  2. 【Java面试题】33 HashMap和Hashtable的区别

    1 HashMap不是线程安全的 hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值.HashMap允许null key和n ...

  3. java面试题之为什么hashmap的数组初始化大小都是2的N次方?

    当数组长度为2的N次方时,不同的key算出的index相同的几率小,数据在数组上分配均匀,hash碰撞的几率小,提升查询效率,从大O(N)提升至O(1):

  4. java算法面试题:有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数 按值的降序排序,如果值相同则按键值的字母顺序

    package com.swift; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; publi ...

  5. 阿里腾讯校招Java面试题总结及答案

    阿里校招java面试题汇总 1.HashMap和HashTable的区别,及其实现原理. Hashtable继承自Dictionary类,而HashMap是Java1.2引进的,继承自Abstract ...

  6. [Java集合] 彻底搞懂HashMap,HashTable,ConcurrentHashMap之关联.

    注: 今天看到的一篇讲hashMap,hashTable,concurrentHashMap很透彻的一篇文章, 感谢原作者的分享. 原文地址: http://blog.csdn.net/zhanger ...

  7. 【转载】关于Java String, StringBuilder, StringBuffer, Hashtable, HashMap的面试题

    REF: http://blog.csdn.net/fightforyourdream/article/details/15333405 题目是一道简单的小程序,像下面这样:[java] view p ...

  8. Java面试题之HashMap阿里面试必问知识点,你会吗?

    面试官Q1:你用过HashMap,你能跟我说说它的数据结构吗? HashMap作为一种容器类型,无论你是否了解过其内部的实现原理,它的大名已经频频出现在各种互联网Java面试题中了.从基本的使用角度来 ...

  9. java面试题——HashMap和Hashtable 的区别

    一.HashMap 和Hashtable 的区别 我们先看2个类的定义 public class Hashtable extends Dictionary implements Map, Clonea ...

随机推荐

  1. 【P3254】圆桌问题(最大流,洛谷)

    看到题目,产生第一反应,是否可以匹配的是这么多.那么连边跑一遍最大流就行了. 从源点向每个单位连一条长度为l的边,然后所有单位和餐桌分别连边,流量为1,所有餐桌向汇点连边,流量为餐桌容量.然后跑一遍最 ...

  2. vs2017创建dotnetcore web项目,并部署到centos7上

    一.打开vs2017创建web项目 二.简单的创建项目后,发布项目 三. 在centos上创建webroot目录,将发布的项目文件复制到该目录下(本人用虚拟机测试) 四.在webroot目录下打开终端 ...

  3. TCP_AIO_Server_ZC_01

    ZC: 这个例子是,1个skt 投递 1个未决的接收操作 1.package aio.Client; 1.1.这是一个 测试的客户端的代码: package aio.Client; import ja ...

  4. php超级全局变量和魔术变量

    php超级全局变量和魔术变量 一.总结 一句话总结: 1.两者的书写形式非常不一样,超级全局变量是$_大写变量名 的形式,魔术变量是 __大写变量名的形式__ 2.两者的应用范围不一样,超级全局变量是 ...

  5. jQuery: Redirect to other URL

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> ...

  6. Django进阶Model篇003 - 数据库同步技巧

    一.认识一个目录 目录名:migrations 作用:用来存放通过makemigrations命令生成的数据库脚本,不熟悉的情况下,里面生成的脚本不要轻易修改.app目录下必须要有migrations ...

  7. 10074 启用开发者模式 for vs2015rc

    1. 关于VS2015RC 有两个版本,它们都包含了Windows 10 SDK. 社区版:免费,可以开发Windows UAP应用.iOS和Android应用.在 帮助->注册产品 菜单可以登 ...

  8. 51nod 1009 数位dp入门

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009 1009 数字1的数量 基准时间限制:1 秒 空间限制:13107 ...

  9. js监测滚动条到达最底边

    scroll : function(){ $(window).scroll(function () { var scrollTop = $(this).scrollTop(); var scrollH ...

  10. WAF 强化学习

    参考:https://github.com/duoergun0729/3book/tree/master/code/gym-waf 代码: wafEnv.py #-*- coding:utf-8 –* ...