在java的众多Map实现中,Map基本上是不能保证顺序的(LinkedHashMap可以保证插入顺序或者访问顺序,TreeMap默认按照key升序但可以自定义Comparator),在开发过程中当数据量不是很大的时候,使用HashMap去统计数据非常方便,但是为了使得输出结果更美观一些,我们需要按某种自定义顺序输出。

下面介绍一种排序Map的方法,使用起来很方便,如下面代码:

1 private static class ValueComparator implements Comparator> {

2

3 @Override

4 public int compare(Map.Entry o1, Map.Entry o2) {

5 return o1.getValue() - o2.getValue();

6 }

7 }

8

9 public static void test3() {

10 Map 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> mapList = new ArrayList<>();

22 mapList.addAll(map.entrySet());

23 for (Map.Entry 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 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> comparator = new Comparator>() {

2 @Override

3 public int compare(Map.Entry o1, Map.Entry o2) {

4 return o1.getKey().compareToIgnoreCase(o2.getKey());

5 }

6 };

7

8 Collections.sort(mapList, comparator);

9 for (Map.Entry entry : mapList) {

10 System.out.println(entry.getKey() + " : " + entry.getValue());

11 }

使用Java 8之后还可以使用lambda表达式简化一下代码

1 Comparator> comparator = (o1, o2) -> o1.getKey().compareToIgnoreCase(o2.getKey());

2

3 Collections.sort(mapList, comparator);

4 for (Map.Entry entry : mapList) {

5 System.out.println(entry.getKey() + " : " + entry.getValue());

6 }