You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:06:18