Sort Map by Value in Java
时间:2022-04-28
本文章向大家介绍Sort Map by Value in Java,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
实际项目或者业务当中,经常会有需求要求对 hashmap 按值排序,并返回指定顺序的 TopN 个元素,今天就来分享下具体的代码及其原理实现。
package com.bj.test.top10;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.NavigableMap;
import java.util.TreeMap;
public class SortMapByValue {
// output the values is descending
public static <K, V extends Comparable<? super V>> List<Entry<K, V>> sortMapByValuesTopN(Map<K, V> map, int topN) {
List<Entry<K, V>> sortedEntries = new ArrayList<Entry<K, V>>(map.entrySet());
Collections.sort(sortedEntries, new Comparator<Entry<K, V>>() {
@Override
public int compare(Entry<K, V> e1, Entry<K, V> e2) {
return e2.getValue().compareTo(e1.getValue());
}
});
int listLen = sortedEntries.size();
// System.out.println(listLen);
while (topN > 0 && listLen > topN) {
listLen--;
sortedEntries.remove(listLen);
}
return sortedEntries;
}
// output the values is descending
public static <K, V extends Comparable<? super V>> List<Entry<K, V>> sortMapByValues(Map<K, V> map) {
List<Entry<K, V>> sortedEntries = new ArrayList<Entry<K, V>>(map.entrySet());
Collections.sort(sortedEntries, new Comparator<Entry<K, V>>() {
@Override
public int compare(Entry<K, V> e1, Entry<K, V> e2) {
return e2.getValue().compareTo(e1.getValue());
}
});
return sortedEntries;
}
public static void printMap(Map<String, Integer> map) {
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println("[Key] : " + entry.getKey() + " [Value] : " + entry.getValue());
}
}
public static Map list2Map(List list) {
// Convert sorted map back to a Map
Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();
for (Iterator<Map.Entry<String, Integer>> it = list.iterator(); it.hasNext();) {
Map.Entry<String, Integer> entry = it.next();
sortedMap.put(entry.getKey(), entry.getValue());
}
return sortedMap;
}
public static void main(String[] args) {
// NavigableMap descMap = new TreeMap<>().descendingMap();
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("A", 34);
map.put("B", 25);
map.put("C", 50);
map.put("D", 50); // "duplicate" value
map.put("z", 10);
map.put("b", 5);
map.put("a", 6);
map.put("c", 20);
map.put("d", 1);
map.put("e", 7);
map.put("y", 8);
map.put("n", 99);
map.put("j", 50);
map.put("m", 2);
map.put("f", 9);
System.out.println("返回前 10 个 value 最大的键值对:");
printMap(list2Map(sortMapByValuesTopN(map, 10)));
System.out.println(sortMapByValuesTopN(map, 10));
System.out.println(list2Map(sortMapByValuesTopN(map, 10)).get("n"));
System.out.println("++++++++++++++++++++++++++++++++++++++n");
System.out.println("返回排序之后的键值对:");
printMap(list2Map(sortMapByValues(map)));
}
}
// 结果:
返回前 10 个 value 最大的键值对:
[Key] : n [Value] : 99
[Key] : C [Value] : 50
[Key] : D [Value] : 50
[Key] : j [Value] : 50
[Key] : A [Value] : 34
[Key] : B [Value] : 25
[Key] : c [Value] : 20
[Key] : z [Value] : 10
[Key] : f [Value] : 9
[Key] : y [Value] : 8
[n=99, C=50, D=50, j=50, A=34, B=25, c=20, z=10, f=9, y=8]
99
++++++++++++++++++++++++++++++++++++++
返回排序之后的键值对:
[Key] : n [Value] : 99
[Key] : C [Value] : 50
[Key] : D [Value] : 50
[Key] : j [Value] : 50
[Key] : A [Value] : 34
[Key] : B [Value] : 25
[Key] : c [Value] : 20
[Key] : z [Value] : 10
[Key] : f [Value] : 9
[Key] : y [Value] : 8
[Key] : e [Value] : 7
[Key] : a [Value] : 6
[Key] : b [Value] : 5
[Key] : m [Value] : 2
[Key] : d [Value] : 1
Refer:
[1] Sort map by value
http://www.leveluplunch.com/java/examples/sort-order-map-by-values/
[2] How to sort a Map in Java
http://www.mkyong.com/java/how-to-sort-a-map-in-java/
[3] Sort a Map<Key, Value> by values (Java)
http://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java
Sorting the Map<Key,Value> in descending order based on the value [duplicate]
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- (长文预警) 你还在烦工作中碰到的拖拽问题?一个框架jiejue
- 重磅 | 青藤与腾讯安全隆重举办容器安全平台新品战略合作发布会
- 如何使用强化学习玩21点?
- 这3个Scikit-learn的特征选择技术,能够有效的提高你的数据预处理能力
- 使用神经网络解决拼图游戏
- 用机器学习预测收益
- 一种基于深度学习的低成本细胞生物学研究方法
- 从零搭建Spring Boot脚手架(2):增加通用的功能
- Qt官方示例-K线图
- 一个快速构造GAN的教程:如何用pytorch构造DCGAN
- 从0到1开发测试平台(八)后端服务添加lombok第三方类库
- 【CSS】470- 是时候开始用 CSS 自定义属性了
- 一个安卓App,如何成为DuerOS 上的技能应用呢?
- 什么是SPU、SKU、SKC、ARPU
- C++判断类型的模板