Java——對Java的Map的Value欄位進行排序
阿新 • • 發佈:2018-12-24
構造TreeMap可以指定Comparator,但是不能對value欄位進行排序。如果有需求對Value欄位排序,例如map存放的是單詞,單詞出現次數,怎麼按單詞次數排序呢?
可以先將map中的key-value放入list,然後用Collections.sort對list排序,再將排序後的list放入LinkedHashMap,最後返回LinkedHashMap就可以了。LinkedHashMap可是個寶貝,可以通過構造方法制定是按放入的順序,還是get順序 排序。LinkedHashMap,稍微修改,可以很容易的實現LRU演算法(最近最少使用)。具體的TreeMap 紅黑樹實現和LinkedHashMap實現還仔細看。
廢話不多說,上程式碼:
public class MapUtil { public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) { List<Map.Entry<K, V>> list = new LinkedList<Map.Entry<K, V>>(map.entrySet()); Collections.sort(list, new Comparator<Map.Entry<K, V>>() { public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) { return (o1.getValue()).compareTo(o2.getValue()); } }); Map<K, V> result = new LinkedHashMap<K, V>(); for (Map.Entry<K, V> entry : list) { result.put(entry.getKey(), entry.getValue()); } return result; } }
Java 7 Version
java 8 versionpublic static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) { List<Map.Entry<K, V>> list = new LinkedList<>(map.entrySet()); Collections.sort(list, new Comparator<Map.Entry<K, V>>() { @Override public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) { return (o1.getValue()).compareTo(o2.getValue()); } }); Map<K, V> result = new LinkedHashMap<>(); for (Map.Entry<K, V> entry : list) { result.put(entry.getKey(), entry.getValue()); } return result; }
public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) {
Map<K, V> result = new LinkedHashMap<>();
Stream<Entry<K, V>> st = map.entrySet().stream();
st.sorted(Comparator.comparing(e -> e.getValue())).forEach(e -> result.put(e.getKey(), e.getValue()));
return result;
}
java 8 版本的程式碼好短啊 ~
以後做個工具包,像這樣的排序直接用工具包使用就可以了。
參考資料:
http://www.cnblogs.com/liu-qing/p/3983496.html (個人部落格)
http://stackoverflow.com/questions/109383/how-to-sort-a-mapkey-value-on-the-values-in-java