【问题标题】:Sum of each values of Guava MultimapGuava Multimap 的每个值的总和
【发布时间】:2019-12-20 00:26:34
【问题描述】:

我创建了一个 Guava Multimap ListMultimap<String,String> sampleMultimap = ArrayListMultimap.create(); 并添加了一些我从文本文件中获取的值。 现在作为输出我有

{Football=[10], Basketball=[1210, 1210, 1210, 120], Tennis=[1, 10, 100, 1000]}

我想对每项运动求和并找到最高的总和。所以预期的结果是

Basketball: 3750

不知何故,我被卡住了,因为我无法使用samleMultimap.get(x) 获取每一个,因为键值未知并且来自文本文件。 有什么方法可以得到预期的结果?

【问题讨论】:

    标签: java arraylist guava multimap


    【解决方案1】:

    最后你想要Map<String, Integer>,其中值是原始多图的总和。您可以使用几个视图:

    • Multimap#asMap()Map<K, Collection<V>> 查看您的多地图,
    • Maps#transformValues(Map, Function) - 创建一个地图视图,其中每个值都由函数转换

      Map<String, Integer> map = Maps.transformValues(multimap.asMap(), ints ->
              ints.stream().mapToInt(Integer::intValue).sum());
      

    请注意,如果您想对结果 map 执行许多操作,请阅读文档中的警告,例如执行 ImmutableMap.copyOf(map)

    该函数被延迟应用,在需要时调用。这对于返回的地图是视图是必要的,但这意味着该函数将多次应用于像Map.containsValue(java.lang.Object)Map.toString() 这样的批量操作。为了使其表现良好,功能应该是快速的。当返回的地图不需要是视图时,为避免延迟评估,请将返回的地图复制到您选择的新地图中。

    【讨论】:

      【解决方案2】:

      使用ListMultimap,您可以调用asMap() 以获取java.util.Map 的视图,然后执行法线贴图。

      如果您将sampleMultimap 更改为ArrayListMultimap 而不是ListMultimap,那么您可以直接调用keySet()(跳过asMap() 调用)并遍历生成的键。

      这是一个示例,展示了如何从 ListMultimap 获取每个键(即使底层实现是 ArrayListMultimap 的实例),然后获取每个关联值:

      ListMultimap<String,String> sampleMultimap = ArrayListMultimap.create();
      Map<String,String> mapView = sampleMultimap.asMap();
      for (String key : mapView.keySet()) {
          String value = mapView.get(key);
          // do something with value
      }
      

      【讨论】:

        猜你喜欢
        • 2010-12-07
        • 2012-10-28
        • 2019-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-30
        • 2011-09-08
        • 1970-01-01
        相关资源
        最近更新 更多