首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不依赖for循环的情况下在Map<String、List<Integer>>中查找最大值的最小值

在不依赖for循环的情况下在Map<String、List<Integer>>中查找最大值的最小值
EN

Stack Overflow用户
提问于 2022-05-26 18:35:11
回答 3查看 783关注 0票数 0

我有一张HashMap<String, List<Integer>>型的地图。

我希望找到每个地图条目的最大值,然后找到这些最大值的最小值。

我知道这可以用几个for循环来完成。但我想知道是否还有其他方法(也许是用小溪?)

我要找的最后结果是一个整数。

示例:

代码语言:javascript
复制
HashMap<String, List<Integer>> values = new HashMap<>();

values.put("a", Arrays.asList(4, 8, 9, 10)); // max value is 10
values.put("b", Arrays.asList(20, 32, 1, 2)); // max value is 32
values.put("c", Arrays.asList(11, 50, 20, 6)); // max value is 50

// I need the min value out of the above maximums i.e. 10 (final answer)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-05-26 19:01:56

您可以使用Collections.minCollections.max方法

代码语言:javascript
复制
HashMap<String, List<Integer>> myMap = new HashMap<>();

Integer min = Collections.min(myMap.values().stream().map(Collections::max).collect(Collectors.toList()));
票数 5
EN

Stack Overflow用户

发布于 2022-05-26 18:45:57

我希望找到每个地图条目的最大值,然后找到这些最大值的最小值。

IntSummaryStatistics就是你的新朋友了。此对象的目的是提供诸如最小值和最大值、消耗的元素数、平均值和它们的总数等信息。

作为结果的容器,我们可以使用map Map<String, IntSummaryStatistics>来保存映射到该值的键的每个值的统计信息。为此,我们需要收集器flatMapping()summarizingInt()的帮助。

然后,为了得到最小的最大值,我们应该处理这个映射的值。

代码语言:javascript
复制
Map<String, List<Integer>> sourceMap = 
    Map.of("a", List.of(4, 8, 9, 10),    // max value is 10
           "b", List.of(20, 32, 1, 2),   // max value is 32
           "c", List.of(11, 50, 20, 6)); // max value is 50
        
Map<String, IntSummaryStatistics> statisticsByKey = sourceMap.entrySet().stream()
    .collect(Collectors.groupingBy(
        Map.Entry::getKey,
        Collectors.flatMapping(entry -> entry.getValue().stream(), // flatens each list
            Collectors.summarizingInt(Integer::intValue))          // creates IntSummaryStatistics object based on the values of each list
    ));
    
statisticsByKey.forEach((k, v)
    -> System.out.println(k + " -> min: " + v.getMin() + " max: " + v.getMax()));
        
int smallestMaximum = statisticsByKey.values().stream()
    .mapToInt(IntSummaryStatistics::getMax)
    .min()        // produces OptionalInt as a result
    .orElse(-1);  // returns a default value of `-1` if result is not present
    
System.out.println("smallestMaximum: " + smallestMaximum);

输出:

代码语言:javascript
复制
a -> min: 4 max: 10
b -> min: 1 max: 32
c -> min: 6 max: 50

smallestMaximum: 10

指向https://www.jdoodle.com/ia/rqi的链接

票数 2
EN

Stack Overflow用户

发布于 2022-05-26 18:45:02

给出地图

代码语言:javascript
复制
Hash<String, List<Integer>> values;

找到每个列表的最大值,然后使用IntStreammin()对这些:

代码语言:javascript
复制
Integer minMax = values.values().stream()
  .map(Collections::max)
  .mapToInt(n -> n).min().getAsInt();

请参见现场演示从示例数据中查找10

对于仅IntStream版本(可能更有效),流值(即整数列表),然后通过将每个列表转换为IntStream并获取其最大值来查找每个列表的最大值,然后查找其中的最小值:

代码语言:javascript
复制
Integer minMax = values.values().stream()
  .mapToInt(v -> v.stream().mapToInt(n -> n).max().getAsInt())
  .min().getAsInt();

现场演示

这假设所有列表都不是空的,映射本身也不是空的。

还有一种利用Collections.max(), but produces an Optional`的方法,这是一种略显迟钝的方式

代码语言:javascript
复制
Integer minMax = values.values().stream()
    .map(Collections::max)
    .collect(Collectors.minBy(Integer::compareTo)).get();

现场演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72396507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档