簡體   English   中英

java - 如何根據帶有Java流的鍵將地圖的值分組到列表中?

[英]How to group values of map into lists based on key with java streams?

假設我有從字符串到從字符串到 int 的映射的映射,例如

Map<String, Map<String, Integer>> myMap1 = new HashMap<>();
myMap1.put("A", Map.of("X", 1))
myMap1.put("B", Map.of("Y", 1))

Map<String, Map<String, Integer>> myMap2 = new HashMap<>();
myMap2.put("B", Map.of("Y", 3))

我想合並這些映射,以便我們得到一個映射,其中鍵是內部映射的鍵,而值將是相同鍵的內部映射值的平均值。 所以上面例子的輸出將是

{"X" : 1, "Y", 2}

我們可以完全丟棄外部映射的鍵。

用 java.time 最好的方法是什么? 我認為使用 Collectors.groupBy 方法可能有一些不錯的方法,但我對此非常缺乏經驗。

我假設可能有兩個以上的地圖,所以讓我們用它們制作一個列表:

    Collection<Map<String, Map<String, Integer>>> myMaps =
        List.of(myMap1, myMap2);

然后我們可以在每個 Map 的values()上使用 flatMap,它給我們一個Map<String, Integer>映射流。

我們可以獲取每個條目的entrySet() ,然后將 flatMap 應用於這些條目集的流,從而為我們提供一個Map.Entry<String, Integer>對象的 Stream,然后我們可以對其進行分組。

有一個groupingBy 方法,它使用第二個收集器來自定義組的值,通過收集所有看到的分組值。 我們可以使用平均收集器來獲得我們的平均值。

Map<String, Double> averages =
    myMaps.stream().flatMap(map -> map.values().stream())       // stream of Map<String, Integer>
        .flatMap(innerMap -> innerMap.entrySet().stream())      // stream of Map.Entry<String, Integer>
        .collect(Collectors.groupingBy(Map.Entry::getKey,       // group by String key
            Collectors.averagingInt(Map.Entry::getValue)));     // value for each key = average of its Integers

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM