在java的眾多Map實現中,Map基本上是不能保證順序的(LinkedHashMap可以保證插入順序或者訪問順序,TreeMap默認按照key升序但可以自定義Comparator),在開發過程中當數據量不是很大的時候,使用HashMap去統計數據非常方便,但是為了使得輸出結果更美觀一些,我們需要按某種自定義順序輸出。
下面介紹一種排序Map的方法,使用起來很方便,如下面代碼:
1 private static class ValueComparator implements Comparator<Map.Entry<String, Integer>> { 2 3 @Override 4 public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { 5 return o1.getValue() - o2.getValue(); 6 } 7 } 8 9 public static void test3() { 10 Map<String, Integer> map = new HashMap<>(); 11 map.put("a", 9); 12 map.put("b", 8); 13 map.put("c", 7); 14 map.put("d", 6); 15 map.put("e", 5); 16 map.put("f", 4); 17 map.put("g", 3); 18 map.put("h", 2); 19 map.put("i", 1); 20 21 List<Map.Entry<String, Integer>> mapList = new ArrayList<>(); 22 mapList.addAll(map.entrySet()); 23 for (Map.Entry<String, Integer> entry : mapList) { 24 System.out.println(entry.getKey() + " : " + entry.getValue()); 25 } 26 System.out.println("\n"); 27 28 ValueComparator valueComparator = new ValueComparator(); 29 Collections.sort(mapList, valueComparator); 30 for (Map.Entry<String, Integer> entry : mapList) { 31 System.out.println(entry.getKey() + " : " + entry.getValue()); 32 } 33 System.out.println("\n"); 34 }
在上面代碼中我們先定義一個Comparator,然后將Map轉換為List,通過Collections.sort(mapList, valueComparator)方法進行排序輸出。
這種寫法還可以簡化一下,Comparator使用的時候才定義。
1 Comparator<Map.Entry<String, Integer>> comparator = new Comparator<Map.Entry<String, Integer>>() { 2 @Override 3 public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { 4 return o1.getKey().compareToIgnoreCase(o2.getKey()); 5 } 6 }; 7 8 Collections.sort(mapList, comparator); 9 for (Map.Entry<String, Integer> entry : mapList) { 10 System.out.println(entry.getKey() + " : " + entry.getValue()); 11 }
使用Java 8之后還可以使用lambda表達式簡化一下代碼
1 Comparator<Map.Entry<String, Integer>> comparator = (o1, o2) -> o1.getKey().compareToIgnoreCase(o2.getKey()); 2 3 Collections.sort(mapList, comparator); 4 for (Map.Entry<String, Integer> entry : mapList) { 5 System.out.println(entry.getKey() + " : " + entry.getValue()); 6 }