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.
我创建了一个 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)
andMap.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.