Java对HashMap进行排序
一、 根据Key排序
方法一 利用TreeMap
TreeMap是基于红黑树的实现,是有序的key-value的集合,该集合根据key的自然顺序进行排序,或是根据构造方法中传入的比较器来进行排序。此外,其构造函数还可以传入一个Map,生成的Map对象是有序的。
升序
默认情况下,TreeMap中的所有键值对是按照key的自然顺序升序排序。因此,只需在TreeMap中添加所有未排序的键值对即可完成升序排列。
1 | Map<String, Integer> unsortMap = createRandomUnsortMap(); |
逆序
如果想要按key逆序,则在TreeMap的构造函数中传入一个Comparator比较器Collections.reverseOrder(),或者Comparator.reverseOrder()1
2
3
4
5
6
7
8
9
10
11Map<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 | Map<String, Integer> unsortMap = createRandomUnsortMap(); |
或者:
Collectors.toMap() 默认返回HashMap,因此我们需要将其转换为LinkedHashMap来保留顺序1
2
3
4
5
6
7
8
9Map<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 | Map<String, Integer> unsortMap = createRandomUnsortMap(); |
或者
1 | Map<String, Integer> unsortMap = createRandomUnsortMap(); |
按照value排序
Java8 Stream + LinkedHashMap
升序
1 | Map<String, Integer> unsortMap = createRandomUnsortMap(); |
或者1
2
3
4
5
6
7
8
9Map<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 | Map<String, Integer> unsortMap = createRandomUnsortMap(); |
或者1
2
3
4
5
6
7
8
9Map<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