文档章节

Sort Map by Value in Java

大数据之路
 大数据之路
发布于 2012/10/03 16:29
字数 592
阅读 211
收藏 3

实际项目或者业务当中,经常会有需求要求对 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]

http://stackoverflow.com/questions/11647889/sorting-the-mapkey-value-in-descending-order-based-on-the-value

© 著作权归作者所有

共有 人打赏支持
大数据之路
粉丝 1492
博文 516
码字总数 342415
作品 0
武汉
架构师
java基础专栏—DBUtils(2)

DBUtils 简化开发的冗余代码 QueryRunner中提供SQL语句操作API ResultSetHandler接口,用于定义select操作后怎样处理结果集 DBUtils对于一切事物的关闭类 是线程安全的 事务 将对个Sql操作封...

T-newcomer
2017/10/20
0
0
在spring+beranate中多数据源中使用 ThreadLocal ,总结的原理 --费元星

设计模式 首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。...

未来星狒狒
2015/09/17
0
0
ThreadLocal可能引起的内存泄露

  threadlocal里面使用了一个存在弱引用的map,当释放掉threadlocal的强引用以后,map里面的value却没有被回收.而这块value永远不会被访问到了. 所以存在着内存泄露. 最好的做法是将调用thr...

天天顺利
06/15
0
0
ThreadLocal 类用法讲解

首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中...

杨松坤
2012/11/25
0
0
深入JDK源码之ThreadLocal类

学习JDK中的类,首先看下JDK API对此类的描述,描述如下:该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程...

陶邦仁
2015/03/26
0
6

没有更多内容

加载失败,请刷新页面

加载更多

下一页

@SpringBootApplication 注解

@SpringBootApplication注解是一个组合注解,包含以下注解 @Target(ElementType.TYPE) 注解的作用目标 @Retention(RetentionPolicy.RUNTIME) Reteniton的作用是定义被它所注解的注解保留多久,...

java.刘
40分钟前
0
0
sentinel自定义DataSource实战

序 本文主要研究一下如何自定义sentinel的DataSource,这里以jdbc为例。 maven <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sen......

go4it
55分钟前
1
0
xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?

问题: 用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了。但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高。用RandomForest所需要的树的深度和Decisio...

tantexian
57分钟前
0
0
php-fpm的pool - 慢执行日志 - 进程管理 - open_basedir

php-fpm的pool : 为避免多站点使用同一个pool时因一个站点故障导致php资源耗尽,牵连使用同一个pool的其他站点的正常工作,可对每一个站点设置独立pool。 增加pool: 1.编辑php-fpm配置文件...

ZHENG-JY
今天
0
0
Linux之ssh服务默认端口修改

导读 SSH是标准的网络协议,可用于大多数UNIX操作系统,能够实现字符界面的远程登录管理,它默认使用22号端口,采用密文的形式在网络中传输数据,相对于通过明文传输的Telnet,具有更高的安全...

问题终结者
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部