Reputation: 25
I created a Guava Multimap
ListMultimap<String,String> sampleMultimap = ArrayListMultimap.create();
And added some values which I take from a text file.
Now as an output I have
{Football=[10], Basketball=[1210, 1210, 1210, 120], Tennis=[1, 10, 100, 1000]}
I would like to sum each of the sports and find the highest sum. So expected result is
Basketball: 3750
Somehow I am stuck because I cant get the each one with samleMultimap.get(x)
because key values are unknown and comes form text file.
Is there any way to get the expected result?
Upvotes: 1
Views: 909
Reputation: 28015
In the end you want Map<String, Integer>
where values are sums of original multimap. You can use couple views:
Multimap#asMap()
to have Map<K, Collection<V>>
view of your multimap,Maps#transformValues(Map, Function)
- to create a view of a map where each value is transformed by a function.
Map<String, Integer> map = Maps.transformValues(multimap.asMap(), ints ->
ints.stream().mapToInt(Integer::intValue).sum());
Note that if you want to perform many operations on resulted map
, read caveat in documentation and for example do 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.
Upvotes: 3
Reputation: 5784
With a ListMultimap
you can call asMap()
to get a view as a java.util.Map
, then do normal map things.
If you change sampleMultimap
to be an ArrayListMultimap
instead of ListMultimap
, then you can call keySet()
directly (skip the asMap()
call) and iterate over the resulting keys.
Here's an example showing how you could get each key from a ListMultimap
(even if the underlying implementation is an instance of ArrayListMultimap
), then get each associated value:
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
}
Upvotes: 1