簡體   English   中英

Java 8:如何對兩個嵌套的Map(其中的ArrayList)進行排序和收集?

[英]Java 8: How to sort and collect two nested Maps with ArrayList inside?

我有以下類型的嵌套Map LinkedHashMap<String, LinkedHashMap<String, ArrayList<Commit>>> 第一個映射的鍵存儲一些用戶名,第二個映射的鍵是用戶的存儲庫名稱,並且在ArrayList中,我有一個帶有一些屬性的對象,如哈希,消息,添加等。

在按第一個地圖的鍵和第二個地圖的鍵按字母順序對整個集合進行排序之后,如何在相同類型的新集合中收集(保存)嵌套的地圖(對象保持不變)?

我需要使用lambda和Stream API進行此操作。 這是我嘗試這樣做的方式:

LinkedHashMap<String, LinkedHashMap<String, ArrayList<Commit>>> sorted = gitUsers.entrySet()
            .stream()
            .sorted((u1, u2) -> u1.getKey().compareTo(u2.getKey()))
            .map(u -> u.getValue()
                    .entrySet()
                    .stream()
                    .sorted((r1, r2) -> collator.compare(r1.getKey(), r2.getKey())))
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,(a, b) -> a, LinkedHashMap::new));

我肯定做錯了,因為我不斷收到以下消息“無法從靜態上下文中引用非靜態方法”,並且無法收集地圖。 由於.map()函數和我使用的第二個流,我想我無法成功組裝地圖。

我知道您會建議我使用TreeMap或對集合進行排序並使用.foreach()方法立即打印它.foreach()順便說一句,我已經做了),但是我需要像我一樣精確地進行上面已經描述了。

為了我的編程基礎知識課程的目的,應該以這種方式解決此問題。 希望對您有所幫助!

PS我一直在尋找解決方案很長時間,並且在包括Stack Overflow論壇在內的所有地方進行了研究,沒有找到與解決問題所要求的方式相對應的任何內容。

您的代碼不編譯甚至我刪除未知整理collator比較。

有效代碼為:

Map<String, Map<String, List<Commit>>> collect = h.entrySet()
        .stream()
        .sorted(Map.Entry.comparingByKey())
        .collect(Collectors.toMap(
                Map.Entry::getKey,
                e -> e.getValue()
                        .entrySet()
                        .stream()
                        .sorted(Map.Entry.comparingByKey())
                        .collect(
                                Collectors.toMap(
                                        Map.Entry::getKey,
                                        Map.Entry::getValue,
                                        (a, b) -> a,
                                        LinkedHashMap::new
                                )
                        ),
                (a, b) -> a,
                LinkedHashMap::new
                )
        );

請注意,您可以用比較器代替Map.Entry.comparingByKey()

2美分,我建議你嘗試EntryStream提供StreamEx為圖流的操作。 這是我的StreamEx叉的解決方案。

StreamEx.of(gitUsers).sortedBy(Entry::getKey)
        .toMap(Entry::getKey, 
               e -> EntryStream.of(e.getValue()).sortedBy(Entry::getKey).toMap(LinkedHashMap::new), 
               () -> new LinkedHashMap<>());

對我來說,代碼簡單明了,更容易理解。 順便說一句,我認為界面始終是首選。 對我來說Map<String, Map<String, List<Commit>>>更好。

暫無
暫無

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

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