Guava Multimap 各值之和

Sum of each values of Guava Multimap

我创建了一个 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) 获取每一个,因为键值是未知的并且来自文本文件。 有什么办法可以达到预期的效果吗?

有了 ListMultimap 你可以调用 asMap() to get a view as a java.util.Map,然后做法线贴图。

如果您将 sampleMultimap 直接更改为 ArrayListMultimap instead of ListMultimap, then you can call 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
}

最后你想要 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):

The function is applied lazily, invoked when needed. This is necessary for the returned map to be a view, but it means that the function will be applied many times for bulk operations like Map.containsValue(java.lang.Object) and Map.toString(). For this to perform well, function should be fast. To avoid lazy evaluation when the returned map doesn't need to be a view, copy the returned map into a new map of your choosing.