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

Java如何返回嵌套Map中最大值/最小值关联的键

实现方案

核心逻辑是遍历嵌套Map中所有歌曲的评分条目,通过比较评分值记录对应的歌曲名即可,以下提供两种常用实现方式:

传统循环实现(兼容所有Java版本)

逻辑直观无版本依赖,支持全局查找所有歌手下的最值歌曲,示例代码如下:

import java.util.HashMap;
import java.util.Map;

public class MultiValueMap {

    public static void main(String[] args) {

        Map<String, HashMap<String, Integer>> singers = new HashMap<>();
        singers.put("Elvis", new HashMap<>());
        singers.get("Elvis").put("All Shook up", 8);
        singers.get("Elvis").put("Don't be Cruel", 5);
        singers.get("Elvis").put("Viva las Vegas", 3);

        // 查询最高评分歌曲
        String highestScoreSong = findSongByScore(singers, true);
        System.out.println(highestScoreSong); // 输出 All Shook up
        // 查询最低评分歌曲
        String lowestScoreSong = findSongByScore(singers, false);
        System.out.println(lowestScoreSong); // 输出 Viva las Vegas
    }

    /**
     * @param singers 两层嵌套的歌手-歌曲-评分映射
     * @param findMax true=查找最高评分,false=查找最低评分
     * @return 对应评分的歌曲名称
     */
    private static String findSongByScore(Map<String, HashMap<String, Integer>> singers, boolean findMax) {
        String targetSong = null;
        // 初始化比较基准值
        int targetScore = findMax ? Integer.MIN_VALUE : Integer.MAX_VALUE;

        for (Map.Entry<String, HashMap<String, Integer>> singerEntry : singers.entrySet()) {
            HashMap<String, Integer> songMap = singerEntry.getValue();
            for (Map.Entry<String, Integer> songEntry : songMap.entrySet()) {
                int currentScore = songEntry.getValue();
                boolean needUpdate = findMax ? currentScore > targetScore : currentScore < targetScore;
                if (needUpdate) {
                    targetScore = currentScore;
                    targetSong = songEntry.getKey();
                }
            }
        }
        return targetSong;
    }
}

Stream简化实现(Java 8+ 可用)

如果项目使用JDK 8及以上版本,可以用Stream平展嵌套结构后直接取最值,代码更简洁:

import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

public class MultiValueMap {
    public static void main(String[] args) {
        Map<String, HashMap<String, Integer>> singers = new HashMap<>();
        singers.put("Elvis", new HashMap<>());
        singers.get("Elvis").put("All Shook up", 8);
        singers.get("Elvis").put("Don't be Cruel", 5);
        singers.get("Elvis").put("Viva las Vegas", 3);

        // 找最高评分歌曲
        Optional<Map.Entry<String, Integer>> maxSong = singers.values().stream()
                .flatMap(songMap -> songMap.entrySet().stream())
                .max(Map.Entry.comparingByValue());
        maxSong.ifPresent(entry -> System.out.println(entry.getKey())); // 输出 All Shook up

        // 找最低评分歌曲
        Optional<Map.Entry<String, Integer>> minSong = singers.values().stream()
                .flatMap(songMap -> songMap.entrySet().stream())
                .min(Map.Entry.comparingByValue());
        minSong.ifPresent(entry -> System.out.println(entry.getKey())); // 输出 Viva las Vegas
    }
}

注意事项

  • 如果存在多首歌曲评分相同且同为最值的场景,上述代码默认返回遍历过程中遇到的第一首歌曲。如果需要返回所有符合条件的歌曲,将单结果变量改为List类型,遇到评分和当前最值相等的条目时直接加入列表即可。
  • 如果只需要查询指定歌手下的最值歌曲,不需要遍历外层所有Map,直接通过歌手名取出对应的内层歌曲Map,再执行上述比较逻辑即可。

内容的提问来源于stack exchange,提问作者Learner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 20:45:53