前提

Map是Java中最常用的集合类之一,这里整理了关于HashMap的排序 (关于List的排序,请查看Collections.sort()的doc或源码)。

将无序的HashMap借助Stream整理成有序的LinkedHashMap。

 

 示例

1.根据key排序:

 1 import java.util.HashMap;
 2 import java.util.LinkedHashMap;
 3 import java.util.Map;
 4 
 5 public class SortByKeyExample {
 6 
 7     public static void main(String[] argv) {
 8 
 9         Map<String, Integer> unsortMap = new HashMap<>();
10         unsortMap.put("z", 10);
11         unsortMap.put("b", 5);
12         unsortMap.put("a", 6);
13         unsortMap.put("c", 20);
14         unsortMap.put("d", 1);
15         unsortMap.put("e", 7);
16         unsortMap.put("y", 8);
17         unsortMap.put("n", 99);
18         unsortMap.put("j", 50);
19         unsortMap.put("m", 2);
20         unsortMap.put("f", 9);
21 
22         System.out.println("Original...");
23         System.out.println(unsortMap);
24 
25         Map<String, Integer> result = new LinkedHashMap<>();
26 
27         //sort by key, a,b,c..., and put it into the "result" map
28         unsortMap.entrySet().stream()
29                 .sorted(Map.Entry.comparingByKey())
30                 .forEachOrdered(x -> result.put(x.getKey(), x.getValue()));
31 
32         System.out.println("Sorted...");
33         System.out.println(result);
34 
35     }
36 
37 }

 结果:

  

 

2.根据value排序:

 1 import java.util.HashMap;
 2 import java.util.LinkedHashMap;
 3 import java.util.Map;
 4 
 5 public class SortByValueExample {
 6 
 7     public static void main(String[] argv) {
 8 
 9         Map<String, Integer> unsortMap = new HashMap<>();
10         unsortMap.put("z", 10);
11         unsortMap.put("b", 5);
12         unsortMap.put("a", 6);
13         unsortMap.put("c", 20);
14         unsortMap.put("d", 1);
15         unsortMap.put("e", 7);
16         unsortMap.put("y", 8);
17         unsortMap.put("n", 99);
18         unsortMap.put("j", 50);
19         unsortMap.put("m", 2);
20         unsortMap.put("f", 9);
21 
22         System.out.println("Original...");
23         System.out.println(unsortMap);
24 
25         Map<String, Integer> result = new LinkedHashMap<>();
26 
27         //sort by value, and reserve, 10,9,8,7,6...
28         unsortMap.entrySet().stream()
29                 .sorted(Map.Entry.<String, Integer>comparingByValue().reversed())  // reversed倒序,不指定类型,会默认为<java.util.Map.Entry<java.lang.Object,V>>
30                 .forEachOrdered(x -> result.put(x.getKey(), x.getValue()));
31 
32         System.out.println("Sorted...");
33         System.out.println(result);
34 
35     }
36 
37 }

 结果:

  

补充一张Map的类图:

LinkedHashMap 是 Map 接口的哈希表和链接列表实现。

LinkedHashMap 实现与 HashMap 的不同之处在于,LinkedHashMap 维护着一个运行于所有条目的双重链接列表,此链接列表定义了迭代顺序。

 

 参考: