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
相关产品推荐
相关产品推荐

