繁体   English   中英

Guava Multimap 的每个值的总和

[英]Sum of each values of 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)获取每个值,因为键值未知并且来自文本文件。 有什么办法可以得到预期的结果吗?

最后你想要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() 为了让这个表现良好,函数应该很快。 为了在返回的地图不需要是视图时避免延迟评估,请将返回的地图复制到您选择的新地图中。

使用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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM