【问题标题】:How to find the Maximum value for specific key in List<TreeMap<Integer,Integer>>?如何在 List<TreeMap<Integer,Integer>> 中找到特定键的最大值?
【发布时间】:2020-11-24 18:38:47
【问题描述】:

请您帮我从地图列表中找到每个键的最大值: 地图列表如下:

[{47=96, 82=189, 100=231, 125=279, 158=322, 240=375},
 {47=125, 82=239, 100=285, 125=334, 158=378, 240=429},
 {47=119, 82=170, 100=182, 125=188, 158=188, 240=170}]

如何找到每个键的最大值?比如key 47的最大值是125,我需要找到每个key的最大值。

List<TreeMap<Integer, Integer>> listOfFreq = new ArrayList<>();

for (int thisFreq : frequencyList) {
    int max = listOfFreq.stream()
            .mapToInt(map -> map.getOrDefault(thisFreq, Integer.MIN_VALUE))
            .max().orElse(0);

【问题讨论】:

    标签: java list dictionary java-8 treemap


    【解决方案1】:

    您可以使用flatMap 展平map 的entrySet,并使用Collectors.toMap 将最大值作为键的值作为新地图收集。

    Map<Integer, Integer> res = 
        listOfFreq.stream()
                  .flatMap(m -> m.entrySet().stream())
                  .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue(), Integer::max));
    

    【讨论】:

      【解决方案2】:

      您可以为此目的使用Collectors.groupingBy(classifier,downstream) 方法:

      List<Map<Integer, Integer>> listOfFreq = List.of(
              // k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6
              Map.of(47, 96, 82, 189, 100, 231, 125, 279, 158, 322, 240, 375),
              Map.of(47, 125, 82, 239, 100, 285, 125, 334, 158, 378, 240, 429),
              Map.of(47, 119, 82, 170, 100, 182, 125, 188, 158, 188, 240, 170));
      
      Map<Integer, Integer> mapOfMaxFreq = listOfFreq
              // Stream<Map<Integer,Integer>>
              .stream()
              // Stream<Set<Map.Entry<Integer,Integer>>>
              .map(Map::entrySet)
              // stream over all entries of all maps
              // Stream<Map.Entry<Integer,Integer>>
              .flatMap(Set::stream)
              // looking for a max value for each key in
              // all map entries and collect them to map
              // Map<Integer,Optional<Map.Entry<Integer,Integer>>>
              .collect(Collectors.groupingBy(
                      Map.Entry::getKey,
                      Collectors.maxBy(Comparator.comparingInt(Map.Entry::getValue))))
              // Collection<Optional<Map.Entry<Integer,Integer>>>
              .values()
              // Stream<Optional<Map.Entry<Integer,Integer>>>
              .stream()
              // get value if present or else (0, 0)
              // Stream<Map.Entry<Integer,Integer>>
              .map(entry -> entry.orElse(Map.entry(0, 0)))
              // collect to map
              .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
      
      System.out.println(mapOfMaxFreq);
      // {240=429, 82=239, 100=285, 125=334, 158=378, 47=125}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-11
        • 2012-12-01
        • 2013-01-16
        • 2014-02-02
        • 2021-05-22
        • 1970-01-01
        相关资源
        最近更新 更多