Java Map的遍历与排序
Java Map的遍历与排序
inkOrCloud前言
因为尝试用Java敲Python题遇到字典排序问题而写
Java Map与Python dict的区别
| Java TreeMap | Java HashMap | Python dict | |
|---|---|---|---|
| 实现原理 | 使用红黑树 | 使用哈希表 | 哈希表 |
| 键类型 | 必须同类型 | 必须同类型,需要提供Comparator或key实现Comparable接口 | 可不同类型,通过地址比较 |
| 有序性 | 无序 | 默认Key升序排序 | 3.6以前无序,3.6及以后有序 |
| 平均查询时间复杂度 | O(logn) | O(1) | O(1) |
| null键 | 不允许 | 允许 | 允许 |
Java Map遍历
Map遍历可以用迭代器遍历或者列表遍历,前者速度更快但只能遍历一次,若需要再次遍历只能重新定义是个iterator对象,若需要重复遍历则后则效率更高 ### 迭代器遍历 用Map.entrySet().iterator()将Map元素以Entry键值对的形式生成迭代器
1 | public static <K,V> void traversal1(Map<K, V> map) { |
这里for循环会比手动创建迭代器稍慢一点 ### 转为List后遍历
用Map.entrySet().iterator()将Map元素以Entry键值对的形式生成列表
1
2
3
4
5
6public static <K,V> void traversal3(Map<K, V> map) {
List<Map.Entry<K, V>> list = new ArrayList<>(map.entrySet());
for (Map.Entry<K, V> kvEntry : list) {
System.out.println(kvEntry);
}
}1
2
3
4
5
6Map<String, Integer> map = new TreeMap<>(new Comparator<String>() {
public int compare(String s, String t1) {
return t1.compareTo(s);
}
});
先说最方便的,调用Map.Entry.comparingByKey()/Map.Entry.comparingByValue()会返回对比Key/Value的Comparator对象
1
2
3
4
5public static <K extends Comparable<K>,V extends Comparable<V>> List<Map.Entry<K, V>> toListSort2(Map<K,V> map) {
List<Map.Entry<K,V>> list = new ArrayList<>(map.entrySet());
list.sort(Map.Entry.comparingByValue());
return list;
}
1 | public static <K extends Comparable<K>,V extends Comparable<V>> List<Map.Entry<K, V>> toListSort1(Map<K,V> map) { |
当然也可以对key和value同时进行比较
1 | public static <K extends Comparable<K>,V extends Comparable<V>> List<Map.Entry<K, V>> toListSor3(Map<K,V> map) { |

![[leetcode 3321][Go][有序集合]计算子数组的 x-sum II](https://s3.inkorcloud.top/image/2025/11/c9f55b2ecb04d16a57547b9f4de294ef.png)
![[leetcode 2589][Go][贪心]完成所有任务的最少时间](https://s3.inkorcloud.top/image/2025/11/b966fd1a91aa1ea098b86e6d778523c2.png)
![[leetcode 3234][Go]统计1显著的字符串的数量](https://s3.inkorcloud.top/image/2025/11/a72a47911de291f51cbb5902e4811c1f.png)
![[leetcode 1611][Go][位运算][记忆化搜索]使整数变为 0 的最少操作次数](https://s3.inkorcloud.top/image/2025/11/9715b5f3d8a7574ded3648767538558e.png)
![[leetcode 2528][Go][二分答案][差分数组][前缀和]最大化城市的最小电量](https://s3.inkorcloud.top/image/2025/11/fa0013722d9361b4383839722394dcf2.png)