【问题标题】:how to reduce a map to get a pair or entry如何减少地图以获得一对或条目
【发布时间】:2021-08-08 07:02:45
【问题描述】:

我有一张图,Integer 代表频率,Set 代表一组词,现在我想减少这张图,得到单词最多的集合的频率,并返回频率和该集合中的单词数与一对

 public static Map<Integer, Set<String>> getCounts(In in)

我的直觉告诉我这没关系,这就是我的想法:

  1. 初始
  2. 分别比较每个单词集,一旦Set中单词的总和大于之前记录的,更新对
  3. 得到这对

但我一开始就卡住了....

 var temp = new Pair<Integer,Integer>(0, 0);
        Stream.of(wordCounts)
                .reduce()

【问题讨论】:

    标签: java functional-programming java-stream


    【解决方案1】:

    请注意,当地图为空时,您可能需要考虑要输出什么。

    您可以在流上使用方便的max 方法

    var pair = wordCounts.entrySet().stream()
        .map(x -> new Pair<>(x.getKey(), x.getValue().size()))
        .max(Comparator.comparing(Pair::getSecond));
    

    这为您提供了一个可选的配对。当地图为空时,可选项将为空。

    如果你真的想使用reduce,你可以。只需将max 调用更改为:

    .reduce((a, b) -> a.getSecond() >= b.getSecond() ? a : b);
    

    【讨论】:

      【解决方案2】:

      我希望我理解正确:

      map.entrySet().stream().max(Comparator.comparing(x -> x.getValue().size()))
              .map(x -> new Map.entry(x.getKey(), x.getValue().size()))
              .orElse(new Map.entry(0, 0));
      

      【讨论】:

      • 是的,这真的很有帮助。非常感谢,但我做了一点改动,IDEA 显示我无法解析符号 entry,所以我将 Map.entry 更改为 Pair,这很好用
      • @Cyber​​lin Map.entry 从 jdk-9 开始确实存在。但是用Pair替换应该是微不足道的
      • @Cyber​​lin 你可以accept the answer
      猜你喜欢
      • 2022-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      相关资源
      最近更新 更多