Java8:如何使用ArrayList对两个嵌套映射进行排序和收集?

Java8:如何使用ArrayList对两个嵌套映射进行排序和收集?,java,lambda,java-8,hashmap,java-stream,Java,Lambda,Java 8,Hashmap,Java Stream,我有以下类型的嵌套映射LinkedHashMap。第一个映射的键存储一些用户名,第二个映射的键是用户的存储库名称,在ArrayList中,我有一个具有一些属性的对象,如哈希、消息、添加等 按照第一个映射的键和第二个映射的键按字母顺序对整个集合进行排序后,如何在相同类型的新集合中收集(保存)嵌套的映射(对象保持不变) 我需要使用lambda和streamapi来实现这一点。以下是我试图做到这一点的方法: LinkedHashMap sorted=gitUsers.entrySet() .strea

我有以下类型的嵌套映射
LinkedHashMap
。第一个映射的键存储一些用户名,第二个映射的键是用户的存储库名称,在ArrayList中,我有一个具有一些属性的对象,如哈希、消息、添加等

按照第一个映射的键和第二个映射的键按字母顺序对整个集合进行排序后,如何在相同类型的新集合中收集(保存)嵌套的映射(对象保持不变)

我需要使用lambda和streamapi来实现这一点。以下是我试图做到这一点的方法:

LinkedHashMap 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()
函数和第二个流

我知道您会建议我使用树形图,或者对集合进行排序,然后立即使用lambda中的
.foreach()
方法将其打印出来(顺便说一下,我已经这样做了),但我需要完全按照上面描述的方式来做

就我的编程基础课程而言,这个问题应该以这种方式解决。希望你的帮助


顺便说一句,我一直在寻找解决方案,并且到处都进行了研究,包括堆栈溢出论坛,但没有找到任何与解决问题的方法相对应的方法。

即使我删除了未知的
collator
comparator排序,您的代码也没有编译

有效代码为:

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 collect=h.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.collect(collector.toMap)(
Map.Entry::getKey,
e->e.getValue()
.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.收集(
汤姆(
Map.Entry::getKey,
Map.Entry::getValue,
(a,b)->a,
LinkedHashMap::新建
)
),
(a,b)->a,
LinkedHashMap::新建
)
);

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

您的代码未编译,即使我删除了通过未知
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 collect=h.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.collect(collector.toMap)(
Map.Entry::getKey,
e->e.getValue()
.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.收集(
汤姆(
Map.Entry::getKey,
Map.Entry::getValue,
(a,b)->a,
LinkedHashMap::新建
)
),
(a,b)->a,
LinkedHashMap::新建
)
);

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

2美分,我建议您试用为地图流操作提供的
EntryStream
。这是我的解决方案

streamx.of(gitUsers).sortedBy(Entry::getKey)
.toMap(条目::getKey,
e->EntryStream.of(e.getValue()).sortedBy(Entry::getKey).toMap(LinkedHashMap::new),
()->新建LinkedHashMap());

对我来说,代码简单明了,而且更容易理解。顺便说一下,我认为界面总是首选的。对我来说,
Map
更好。

2美分,我建议您试用为Map流操作提供的
EntryStream
。这是我的解决方案

streamx.of(gitUsers).sortedBy(Entry::getKey)
.toMap(条目::getKey,
e->EntryStream.of(e.getValue()).sortedBy(Entry::getKey).toMap(LinkedHashMap::new),
()->新建LinkedHashMap());

对我来说,代码简单明了,而且更容易理解。顺便说一下,我认为界面总是首选的。对我来说,
Map
更好。

gitUsers.entrySet()返回什么类型?gitUsers是以下类型的映射
LinkedHashMap gitUsers=new LinkedHashMap()正如我在文章开头提到的。这是我按照第一个映射的键和第二个嵌套映射的键排序的初始映射,现在我想收集它-内部带有ArrayList的两个映射收集到相同类型的映射。请查看我的答案。我还建议您将帖子重命名为:how to do nested map sorting或smth,因为它更一般。gitUsers.entrySet()返回什么类型?gitUsers是以下类型的映射
LinkedHashMap gitUsers=new LinkedHashMap()正如我在文章开头提到的。这是我按照第一个映射的键和第二个嵌套映射的键排序的初始映射,现在我想收集它-两个包含ArrayList的映射都收集到映射