前提
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 維護着一個運行於所有條目的雙重鏈接列表,此鏈接列表定義了迭代順序。