Java如何按内层嵌套HashMap大小降序排序输出外层Map内容
嵌套HashMap按内层元素数排序输出实现方案
HashMap以及你当前使用的ConcurrentHashMap都属于无序Map,不会维护元素的存储顺序,直接遍历entrySet()得到的条目顺序是不确定的,无法满足按内层Map元素数排序输出的需求。实现该需求的核心思路是:先取出外层Map的所有条目,按自定义规则排序后,再遍历打印结果。
Java 8+ 最简实现(Stream写法)
不需要修改你原来往Map里填充数据的逻辑,只需要替换遍历打印的部分即可,代码如下:
import java.util.Comparator; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; // 保留你原有其他导入项 public class MapSortDemo { public static void main(String[] args) { Map<String, Map<String, Integer>> states = new ConcurrentHashMap<>(); // 原有填充states数据的逻辑保持不变 // 对条目按内层Map大小降序排序后遍历输出 states.entrySet().stream() .sorted(Comparator.comparingInt((Map.Entry<String, Map<String, Integer>> entry) -> entry.getValue().size()).reversed()) .forEachOrdered(entry -> { System.out.println("State:" + entry.getKey()); Map<String, Integer> tempMap = entry.getValue(); for (Map.Entry<String, Integer> innerEntry : tempMap.entrySet()) { System.out.println("City:" + innerEntry.getKey() + " Count:" + innerEntry.getValue()); } System.out.println(); }); } }
Java 7及更早版本兼容写法
如果你的开发环境不支持Stream语法,可以手动将外层Map的条目存入List,通过Collections.sort自定义排序规则后遍历:
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; // 保留原有其他导入项 public class MapSortDemo { public static void main(String[] args) { Map<String, Map<String, Integer>> states = new ConcurrentHashMap<>(); // 原有填充states数据的逻辑保持不变 // 将外层Map所有条目转入List List<Map.Entry<String, Map<String, Integer>>> entryList = new ArrayList<>(states.entrySet()); // 自定义比较规则:按内层Map的size降序排列 Collections.sort(entryList, new Comparator<Map.Entry<String, Map<String, Integer>>>() { @Override public int compare(Map.Entry<String, Map<String, Integer>> o1, Map.Entry<String, Map<String, Integer>> o2) { return Integer.compare(o2.getValue().size(), o1.getValue().size()); } }); // 遍历排序后的List输出,逻辑和你原有写法完全一致 for (Map.Entry<String, Map<String, Integer>> entry : entryList) { System.out.println("State:" + entry.getKey()); Map<String, Integer> tempMap = entry.getValue(); for (Map.Entry<String, Integer> innerEntry : tempMap.entrySet()) { System.out.println("City:" + innerEntry.getKey() + " Count:" + innerEntry.getValue()); } System.out.println(); } } }
注意事项
- 上述两种实现都不会修改原
statesMap的内部存储顺序,仅对输出前的临时集合做排序 - 如果需要多次按该顺序读取Map数据,可以将排序后的结果存入
LinkedHashMap这类保序的Map实现中,避免每次读取都重复排序 - 内层Map如果存在null值的情况,要提前做空判断,避免调用
size()时抛出空指针异常
内容的提问来源于stack exchange,提问作者Vinula Senarathne
相关产品推荐
相关产品推荐

