Java中Map按照值排序
Posted luffy5459
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中Map按照值排序相关的知识,希望对你有一定的参考价值。
Java中,Map最简单的实现就是HashMap,他默认是按照键来排序,有时候,我们可能会有一种需求,就是需要按照值来排序。这就需要做个小算法。
整个算法的思路,其实很简单,就是遍历value集合,按照值的大小排序,然后组成新的Map映射。似乎有点简单,但是又有点难度,难的地方在于,Map是一个Entry<K,V>集合,单纯的比较value大小,很简单,但是要带上键,似乎有点麻烦。
这个比较,需要考虑按照对象来比较。对象比较,就可以考虑按照对象的属性来比较,这样问题就解决了。
show me the code:
package com.xxx.huali.hualitest;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
public class MapValueSortDemo {
/**
* { <1:10>,<4:100>,<2:5>,<3:3> } -> [<3:3>,<2:5>,<1:10>,<4:100>] -> {<3:3>,<2:5>,<1:10>,<4:100>}
* @param <K>
* @param <V>
* @param map
* @return
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public static <K extends Comparable,V extends Comparable> Map<K, V> sortMapByValues(Map<K, V> map){
HashMap<K, V> finalMap = new LinkedHashMap<K, V>();
//取出map键值对Entry<K,V>,然后按照值排序,最后组成一个新的列表集合
List<Entry<K, V>> list = map.entrySet()
.stream()
.sorted((p1,p2)->p1.getValue().compareTo(p2.getValue()))
.collect(Collectors.toList());
//遍历集合,将排好序的键值对Entry<K,V>放入新的map并返回
//因为HashMap默认是按照键排序,所以新的map还是HashMap,那么就还原了。达不到排序的效果。
//所以新的map需要LinkedHashMap类型。这里也可以看出LinkedHashMap是按照顺序存储。
list.forEach(ele->finalMap.put(ele.getKey(), ele.getValue()));
return finalMap;
}
public static void main(String[] args) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(1, 10);
map.put(4, 100);
map.put(2, 5);
map.put(3, 3);
//map默认会按照键(大小)来排序
System.out.println("before : "+map); // {<1:10>,<2:5>,<3:3>,<4:100>}
map = sortMapByValues(map);
System.out.println("after : "+map); // {<3:3>,<2:5>,<1:10>,<4:100>}
}
}
打印结果:
算法里面使用jdk8集合流处理,大大简化了代码,但是需要理解这个里面的逻辑,开始是取出Map映射的键值对Entry<K,V>,然后做了对象比较,对象比较是比较的value属性,因此,新的集合是List<Entry<K,V>>,这是一个排好序的List集合,并不是一个Map映射,最后需要遍历这个集合,再将它转为Map,如果还是使用HashMap,那么排序效果就失效了,这里需要一种按照顺序存储的Map,所以选择了LinkedHashMap。
以上是关于Java中Map按照值排序的主要内容,如果未能解决你的问题,请参考以下文章