hashmap排序
时间: 2025-05-04 22:24:55 浏览: 29
### 如何对Java HashMap按键或值排序
#### 按键排序
当需要按照键对`HashMap`进行排序时,可以利用`TreeMap`自动按键排序的功能或者手动实现。对于手动实现的方式,在Java 8之后推荐使用流(Stream API)和Lambda表达式来简化操作。
```java
import java.util.*;
public class SortByKey {
public static void main(String[] args) {
Map<String, Integer> unsortMap = new HashMap<>();
unsortMap.put("z", 10);
unsortMap.put("b", 5);
unsortMap.put("a", 6);
unsortMap.put("c", 20);
unsortMap.put("d", 1);
// 使用 Stream 和 Lambda 表达式按键排序
LinkedHashMap<String, Integer> result = unsortMap.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> oldValue,
LinkedHashMap::new));
System.out.println(result);
}
}
```
此代码片段展示了如何通过`entrySet()`方法获取映射项集合作为输入给`stream()`, 接着调用`sorted()`函数传入`comparingByKey()`作为参数完成按键的自然顺序排列[^3]。
#### 按值排序
同样地,按值排序也可以借助于上述提到的技术栈——即Stream API加上Lambda表达式的组合来进行处理:
```java
import java.util.*;
import java.util.stream.Collectors;
public class SortByValue {
public static void main(String[] args) {
Map<String, Integer> unsortMap = new HashMap<>();
unsortMap.put("e", 7);
unsortMap.put("f", 9);
unsortMap.put("g", 4);
unsortMap.put("h", 3);
unsortMap.put("i", 2);
// 对 map 的 value 进行升序排序
List<Map.Entry<String, Integer>> list =
unsortMap.entrySet().stream()
.sorted((o1, o2) -> o1.getValue().compareTo(o2.getValue()))
.toList();
// 将已排序列表转回成 LinkedHashMap 来保持插入顺序
LinkedHashMap<String, Integer> sortedMapAscend = new LinkedHashMap<>();
for (Map.Entry<String, Integer> entry : list) {
sortedMapAscend.put(entry.getKey(), entry.getValue());
}
System.out.println(sortedMapAscend);
}
}
```
这里先是对原始`HashMap`里的条目进行了基于其关联数值大小的比较与排序;随后再把这些已经排好序的对象重新组装进一个新的`LinkedHashMap`实例里以便能够记住它们之间的相对位置关系。
另外一种更简洁的做法是直接采用内置工具类`Collectors.collectingAndThen`配合`toMap`收集器以及自定义比较逻辑达到相同效果:
```java
// 更加优雅的一次性完成排序并构建新的有序映射表
Map<String, Integer> collect = unsortMap.entrySet().stream()
.sorted(Entry.<String, Integer>comparingByValue())
.collect(Collectors.toMap(
Entry::getKey,
Entry::getValue,
(v1, v2)->{throw new IllegalStateException();},
LinkedHashMap::new));
```
这种方法不仅减少了中间变量的数量还提高了可读性和维护效率[^4]。
阅读全文
相关推荐

















