一、 根据Key排序

方法一 利用TreeMap

TreeMap是基于红黑树的实现,是有序的key-value的集合,该集合根据key的自然顺序进行排序,或是根据构造方法中传入的比较器来进行排序。此外,其构造函数还可以传入一个Map,生成的Map对象是有序的。

升序

默认情况下,TreeMap中的所有键值对是按照key的自然顺序升序排序。因此,只需在TreeMap中添加所有未排序的键值对即可完成升序排列。

1
2
3
4
5
6
7
8
9
10
Map<String, Integer> unsortMap = createRandomUnsortMap();

Map<String, Integer> sortedMap = new TreeMap<>(unsortMap);
sortedMap.forEach((k, v) -> System.out.println(k + " -> " + v));
// 输出
// acedb -> 12
// adbec -> 17
// bcdea -> 15
// eabcd -> 19
// ebacd -> 11

逆序

如果想要按key逆序,则在TreeMap的构造函数中传入一个Comparator比较器Collections.reverseOrder(),或者Comparator.reverseOrder()

1
2
3
4
5
6
7
8
9
10
11
Map<String, Integer> unsortMap = createRandomUnsortMap();

Map<String, Integer> reverseSortedMap = new TreeMap<>(Collections.reverseOrder());
reverseSortedMap.putAll(unsortMap);
reverseSortedMap.forEach((k, v) -> System.out.println(k + " -> " + v));
// 输出
// ecdba -> 9
// decab -> 13
// dbcae -> 7
// cbade -> 10
// bdeca -> 0

方法二 Java8 Stream + LinkedHashMap

升序

在Java 8中,Map.Entry类具有静态方法compareByKey()可以按key进行排序,这个方法返回一个Comparator,该Comparator以自然顺序比较键上的Map.Entry。
或者,您可以传递自定义比较器以用于排序,这种方式可以对Map进行逆序排序。

1
2
3
4
5
6
7
Map<String, Integer> unsortMap = createRandomUnsortMap();

Map<String, Integer> sortedMap = new LinkedHashMap<>();
unsortMap.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.forEachOrdered(entry -> sortedMap.put(entry.getKey(), entry.getValue()));

或者:

Collectors.toMap() 默认返回HashMap,因此我们需要将其转换为LinkedHashMap来保留顺序

1
2
3
4
5
6
7
8
9
Map<String, Integer> unsortMap = createRandomUnsortMap();

Map<String, Integer> sortedMap = unsortMap.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> newValue,
LinkedHashMap::new));

逆序

逆序可以:

  • Map.Entry.comparingByKey(Comparator.reverseOrder())
  • Map.Entry.comparingByKey(Colloections.reverseOrder())
  • Map.Entry.<String, Integer>comparingByKey().reversed()
  • Collections.reverseOrder(Map.Entry.comparingByKey())
1
2
3
4
5
6
7
Map<String, Integer> unsortMap = createRandomUnsortMap();

Map<String, Integer> sortedMap = new LinkedHashMap<>();
unsortMap.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey(Comparator.reverseOrder())) // 或者Collections.reverseOrder()
.forEachOrdered(entry -> sortedMap.put(entry.getKey(), entry.getValue()));

或者

1
2
3
4
5
6
7
8
9
Map<String, Integer> unsortMap = createRandomUnsortMap();

Map<String, Integer> sortedMap = unsortMap.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey(Comparator.reverseOrder())) // 或者Collections.reverseOrder()
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> newValue,
LinkedHashMap::new));

按照value排序

Java8 Stream + LinkedHashMap

升序

1
2
3
4
5
6
7
Map<String, Integer> unsortMap = createRandomUnsortMap();

Map<String, Integer> sortedMap = new LinkedHashMap<>();
unsortMap.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
.forEachOrdered(entry -> sortedMap.put(entry.getKey(), entry.getValue()));

或者

1
2
3
4
5
6
7
8
9
Map<String, Integer> unsortMap = createRandomUnsortMap();

Map<String, Integer> sortedMap = unsortMap.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> newValue,
LinkedHashMap::new));

逆序

逆序可以:

  • Map.Entry.comparingByValue(Comparator.reverseOrder())
  • Map.Entry.comparingByValue(Colloections.reverseOrder())
  • Map.Entry.<String, Integer>comparingByValue().reversed()
  • Collections.reverseOrder(Map.Entry.comparingByValue())
1
2
3
4
5
6
7
Map<String, Integer> unsortMap = createRandomUnsortMap();

Map<String, Integer> sortedMap = new LinkedHashMap<>();
unsortMap.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) // 或者Collections.reverseOrder()
.forEachOrdered(entry -> sortedMap.put(entry.getKey(), entry.getValue()));

或者

1
2
3
4
5
6
7
8
9
Map<String, Integer> unsortMap = createRandomUnsortMap();

Map<String, Integer> sortedMap = unsortMap.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) // 或者Collections.reverseOrder()
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> newValue,
LinkedHashMap::new));

参考阅读

[1]Java sort Map by key (ascending and descending orders)
[2]Java sort Map by values (ascending and descending orders)
[3]Java 8 – How to sort a Map
[4]java8 hashMap排序的新认识
[5]How to Sort a Map by Value in Java 8+
[6]How to sort a map in Java 8
[7]Java Map 按Key排序和按Value排序
[8]Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例
[9]JAVA学习-TreeMap详解
[10]How to sort a TreeMap by value in java