[英]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.