在java中怎样对一个Map进行排序(java 8之前的版本)

 几个对一个Map的keys或者values进行排序的java例子.

注意:

如果你使用的是 Java 8, 参考这篇文章 – 
Java 8 – 怎样对Map排序 

1. 按照key排序

1.1 用 java.util.TreeMap, 它将自动根据keys对Map进行排序.

SortByKeyExample1.java

package com.mkyong.test; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; public class SortByKeyExample1 { public static void main(String[] args) { Map<String, String> unsortMap = new HashMap<String, String>(); unsortMap.put("Z", "z"); unsortMap.put("B", "b"); unsortMap.put("A", "a"); unsortMap.put("C", "c"); unsortMap.put("D", "d"); unsortMap.put("E", "e"); unsortMap.put("Y", "y"); unsortMap.put("N", "n"); unsortMap.put("J", "j"); unsortMap.put("M", "m"); unsortMap.put("F", "f"); System.out.println("Unsort Map......"); printMap(unsortMap); System.out.println("\nSorted Map......By Key"); Map<String, String> treeMap = new TreeMap<String, String>(unsortMap); printMap(treeMap); } //pretty print a map public static <K, V> void printMap(Map<K, V> map) { for (Map.Entry<K, V> entry : map.entrySet()) { System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue()); } } }

Output

Unsort Map......
Key : A Value : a
Key : B Value : b
Key : C Value : c
Key : D Value : d
Key : E Value : e
Key : F Value : f
Key : Y Value : y
Key : Z Value : z
Key : J Value : j
Key : M Value : m
Key : N Value : n

Sorted Map......By Key
Key : A Value : a
Key : B Value : b
Key : C Value : c
Key : D Value : d
Key : E Value : e
Key : F Value : f
Key : J Value : j
Key : M Value : m
Key : N Value : n
Key : Y Value : y
Key : Z Value : z

1.2 另一个 java.util.TreeMap 例子 ,提供一个自定义的 Comparator 对可以进行降序排序.

SortByKeyExample2.java

package com.mkyong.test; import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; public class SortByKeyExample2 { public static void main(String[] args) { Map<Integer, String> unsortMap = new HashMap<Integer, String>(); unsortMap.put(10, "z"); unsortMap.put(5, "b"); unsortMap.put(6, "a"); unsortMap.put(20, "c"); unsortMap.put(1, "d"); unsortMap.put(7, "e"); unsortMap.put(8, "y"); unsortMap.put(99, "n"); unsortMap.put(50, "j"); unsortMap.put(2, "m"); unsortMap.put(9, "f"); System.out.println("Unsort Map......"); printMap(unsortMap); System.out.println("\nSorted Map......By Key"); Map<Integer, String> treeMap = new TreeMap<Integer, String>( new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2.compareTo(o1); } }); /* For Java 8, try this lambda Map<Integer, String> treeMap = new TreeMap<>( (Comparator<Integer>) (o1, o2) -> o2.compareTo(o1) ); */ treeMap.putAll(unsortMap); printMap(treeMap); } public static <K, V> void printMap(Map<K, V> map) { for (Map.Entry<K, V> entry : map.entrySet()) { System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue()); } } }

Output

Unsort Map......
Key : 1 Value : d
Key : 50 Value : j
Key : 2 Value : m
Key : 99 Value : n
Key : 20 Value : c
Key : 5 Value : b
Key : 6 Value : a
Key : 7 Value : e
Key : 8 Value : y
Key : 9 Value : f
Key : 10 Value : z

Sorted Map......By Key
Key : 99 Value : n
Key : 50 Value : j
Key : 20 Value : c
Key : 10 Value : z
Key : 9 Value : f
Key : 8 Value : y
Key : 7 Value : e
Key : 6 Value : a
Key : 5 Value : b
Key : 2 Value : m
Key : 1 Value : d

2. 按照value排序

将 Map 转换放入一个 List<Map>, 用一个自定义的  Comparator对 List<Map> 进行排序 并且将其放入一个新的 有序map – LinkedHashMap 中。

Map ---> List<Map> ---> Collections.sort() --> List<Map> (Sorted) ---> LinkedHashMap

SortByValueExample1.java

package com.mkyong.test; import java.util.*; public class SortByValueExample1 { public static void main(String[] args) { Map<String, Integer> unsortMap = new HashMap<String, Integer>(); unsortMap.put("z", 10); unsortMap.put("b", 5); unsortMap.put("a", 6); unsortMap.put("c", 20); unsortMap.put("d", 1); unsortMap.put("e", 7); unsortMap.put("y", 8); unsortMap.put("n", 99); unsortMap.put("j", 50); unsortMap.put("m", 2); unsortMap.put("f", 9); System.out.println("Unsort Map......"); printMap(unsortMap); System.out.println("\nSorted Map......By Value"); Map<String, Integer> sortedMap = sortByValue(unsortMap); printMap(sortedMap); } private static Map<String, Integer> sortByValue(Map<String, Integer> unsortMap) { // 1. Convert Map to List of Map List<Map.Entry<String, Integer>> list = new LinkedList<Map.Entry<String, Integer>>(unsortMap.entrySet()); // 2. Sort list with Collections.sort(), provide a custom Comparator // Try switch the o1 o2 position for a different order Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return (o1.getValue()).compareTo(o2.getValue()); } }); // 3. Loop the sorted list and put it into a new insertion order Map LinkedHashMap Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>(); for (Map.Entry<String, Integer> entry : list) { sortedMap.put(entry.getKey(), entry.getValue()); } /* //classic iterator example 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 <K, V> void printMap(Map<K, V> map) { for (Map.Entry<K, V> entry : map.entrySet()) { System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue()); } } }

Output

Unsort Map......
Key : a Value : 6
Key : b Value : 5
Key : c Value : 20
Key : d Value : 1
Key : e Value : 7
Key : f Value : 9
Key : y Value : 8
Key : z Value : 10
Key : j Value : 50
Key : m Value : 2
Key : n Value : 99

Sorted Map......By Value
Key : d Value : 1
Key : m Value : 2
Key : b Value : 5
Key : a Value : 6
Key : e Value : 7
Key : y Value : 8
Key : f Value : 9
Key : z Value : 10
Key : c Value : 20
Key : j Value : 50
Key : n Value : 99

2.2 升级上面的sortByValue() 方法去支持泛型.

public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> unsortMap) { List<Map.Entry<K, V>> list = new LinkedList<Map.Entry<K, V>>(unsortMap.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; }
    原文作者:wangmm0218
    原文地址: https://blog.csdn.net/wangmuming/article/details/78448394
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞