簡體   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