Java 8:如何使用ArrayList对两个嵌套的Maps进行排序和收集?

Val*_* E. 1 java lambda hashmap java-8 java-stream

我有一个以下类型的嵌套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));
Run Code Online (Sandbox Code Playgroud)

我肯定做错了,因为我不断收到以下消息"无法从静态上下文中引用非静态方法"并且无法收集地图.我想我无法成功组装我的地图因为.map()我使用的功能和第二个流.

我知道你会建议我使用TreeMap或者使用.foreach()我的lambda中的方法对它进行排序并立即打印(顺便提一下我已经做过),但我需要像上面描述的那样完全按照这种方式进行排序..

出于我的编程基础课程的目的,这个问题应该以这种方式解决.希望对你有所帮助!

PS我一直在寻找解决方案很长一段时间,并在各地进行研究,包括Stack Overflow论坛,并没有找到任何对应于所要求的解决问题的方法.

ale*_*x.b 5

您的代码未编译,即使我删除未知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
                )
        );
Run Code Online (Sandbox Code Playgroud)

请注意,您可以使用比较器代替Map.Entry.comparingByKey().

  • 我管理它`.sorted(Map.Entry.comparingByKey(collat​​or))`.一切都好.:) (2认同)