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。

Guess you like

Origin blog.csdn.net/feinifi/article/details/120012403