博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何对HashMap按键值排序
阅读量:5957 次
发布时间:2019-06-19

本文共 3470 字,大约阅读时间需要 11 分钟。

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

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

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

Map
aMap = new HashMap
();

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

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

ap
aMap = new HashMap
();        // 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
> mapEntries = aMap.entrySet();

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

List
> aList = new LinkedList
>(mapEntries);

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

Collections.sort(aList, new Comparator
>() {            @Override            public int compare(Entry
ele1, Entry
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 
> void sort(List
list) public static
void sort(List
list, Comparator
c)

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

// Storing the list into Linked HashMap to preserve the order of insertion.      Map
aMap2 = new LinkedHashMap
(); for(Entry
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
aMap = new HashMap
(); // 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
aMap) { Set
> mapEntries = aMap.entrySet(); System.out.println("Values and Keys before sorting "); for(Entry
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
> aList = new LinkedList
>(mapEntries); // sorting the List Collections.sort(aList, new Comparator
>() { @Override public int compare(Entry
ele1, Entry
ele2) { return ele1.getValue().compareTo(ele2.getValue()); } }); // Storing the list into Linked HashMap to preserve the order of insertion. Map
aMap2 = new LinkedHashMap
(); for(Entry
entry: aList) { aMap2.put(entry.getKey(), entry.getValue()); } // printing values after soring of map System.out.println("Value " + " - " + "Key"); for(Entry
entry : aMap2.entrySet()) { System.out.println(entry.getValue() + " - " + entry.getKey()); } } }

 

转载于:https://www.cnblogs.com/doudouxiaoye/p/5811622.html

你可能感兴趣的文章
JS 单例模式
查看>>
解决oninput事件在中文输入法下会取得拼音的值的问题
查看>>
Hooking & Executing Code with dlopen & dlsym -- C functions
查看>>
GitLab 安装笔记
查看>>
JavaScript 异步队列及Co实现
查看>>
原生javascript实现无缝滚动
查看>>
EventBus使用方法详解
查看>>
使用 Phoenix-4.11.0连接 Hbase 集群 ,并使用 JDBC 查询测试
查看>>
判断字符串是否含有中英文和数字
查看>>
javascript模拟原生Promise语法
查看>>
Linux机器相互登录
查看>>
GitChat · 人工智能 | 用语音和自然语言控制智能家居——实例分享
查看>>
使用certbot为你的网站免费上https
查看>>
toString与toLocaleString在不同数据类型下输出的差异
查看>>
es6学习笔记-Symbol_v1.0_byKL
查看>>
ES6简单了解
查看>>
vue源码学习之简单的数据监听
查看>>
koa中间件机制详解
查看>>
Python-Decorator
查看>>
理解BERT Transformer:Attention is not all you need!
查看>>