在Java中比较2个以上的列表(动态决定列表数量)

在Java中比较2个以上的列表(动态决定列表数量),java,arrays,object,collections,Java,Arrays,Object,Collections,以上代码是ans的第一步。因此,我得到了我在评论中提到的错误 希望输出如下所示: 子女、配偶、mbr=A、B、C 配偶,Mbr=D Mbr=E 您可以使用Java流和收集器。groupingBy()解决此问题: Map<String, List<MainList>> result = mainList.stream() .flatMap(o -> o.getChildList().stream().map(c -> Map.entry(c, o)))

以上代码是ans的第一步。因此,我得到了我在评论中提到的错误

希望输出如下所示:

  • 子女、配偶、mbr=A、B、C
  • 配偶,Mbr=D
  • Mbr=E

  • 您可以使用Java流和
    收集器。groupingBy()
    解决此问题:

    Map<String, List<MainList>> result = mainList.stream()
        .flatMap(o -> o.getChildList().stream().map(c -> Map.entry(c, o)))
        .collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
    
    在此之后,您可以再次按对象列表分组,以获得所有对象作为键的地图和子项列表:

    Map<String, List<MainList>> result = mainList.stream()
            .flatMap(o -> o.getChildList().stream().map(c -> Map.entry(c, o)))
            .collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
    
    {
        A: [{relation=[{cd='CH', desc='Child'}], childList=[A, B, C]}, {relation=[{cd='SPS', desc='Spouse'}], childList=[A, B, C, D]}, {relation=[{cd='MBR', desc='Member'}], childList=[A, B, C, D, E]}]
        B: [{relation=[{cd='CH', desc='Child'}], childList=[A, B, C]}, {relation=[{cd='SPS', desc='Spouse'}], childList=[A, B, C, D]}, {relation=[{cd='MBR', desc='Member'}], childList=[A, B, C, D, E]}]
        C: [{relation=[{cd='CH', desc='Child'}], childList=[A, B, C]}, {relation=[{cd='SPS', desc='Spouse'}], childList=[A, B, C, D]}, {relation=[{cd='MBR', desc='Member'}], childList=[A, B, C, D, E]}]
        D: [{relation=[{cd='SPS', desc='Spouse'}], childList=[A, B, C, D]}, {relation=[{cd='MBR', desc='Member'}], childList=[A, B, C, D, E]}]
        E: [{relation=[{cd='MBR', desc='Member'}], childList=[A, B, C, D, E]}]
    }
    
    这里的关键是映射
    Map.entry(c,o)
    。您可以将条目(
    o
    )的值替换为结果键所需的任何值。上面的示例将所有
    MainList
    s作为键。如果需要
    Map
    ,可以使用
    Map.entry(c,o.getRelation())
    。或者,如果您只需要第一个关系(
    Map
    ),请使用
    Map.entry(c,o.getRelation().get(0))
    。但是要注意空列表,也许可以使用可选的包装

    如果您需要每个第一个关系的
    desc
    字符串作为键,您可以使用:

    {
        [{relation=[{cd='SPS', desc='Spouse'}], childList=[A, B, C, D]}, {relation=[{cd='MBR', desc='Member'}], childList=[A, B, C, D, E]}]: [D]
        [{relation=[{cd='MBR', desc='Member'}], childList=[A, B, C, D, E]}]: [E]
        [{relation=[{cd='CH', desc='Child'}], childList=[A, B, C]}, {relation=[{cd='SPS', desc='Spouse'}], childList=[A, B, C, D]}, {relation=[{cd='MBR', desc='Member'}], childList=[A, B, C, D, E]}]: [A, B, C]
    }
    

    你试过什么?
    CollectionUtils.intersection(mainList.get(i).childList(),mainList.get(i+1).childList())和CollectionUtils.subtract(mainList.get(i).childList(),mainList.get(i+1).childList())
    得到了部分结果,但不是预期的结果。一旦到达列表末尾,将索引从与i+1的绑定中移出MyObject的结构是什么?父对象是指mainList Obj?是否可以在没有流、收集器的情况下实现这一点?我得到的类型不匹配:无法从Stream转换为
    Map result=mainList.Stream().flatMap(o->o.getChildList().Stream().Map(c->Map.entry(c,o.getRelationship().get(0.getDesc()))).collector(Collectors.groupingBy(Map.entry::getKey,Collectors.mapping(Map.entry::getValue,Collectors.toList())).entrySet().stream().collect(Collectors.groupingBy(Map.Entry::getValue,Collectors.mapping(Map.Entry::getKey,Collectors.toList()))对于此类型,还将获得类型不匹配:无法从流转换为更新的关系类
    
    Map<List<MainList>, List<String>> result = mainList.stream()
            .flatMap(o -> o.getChildList().stream().map(c -> Map.entry(c, o)))
            .collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList())))
            .entrySet().stream()
            .collect(Collectors.groupingBy(Map.Entry::getValue, Collectors.mapping(Map.Entry::getKey, Collectors.toList())));
    
    {
        [{relation=[{cd='SPS', desc='Spouse'}], childList=[A, B, C, D]}, {relation=[{cd='MBR', desc='Member'}], childList=[A, B, C, D, E]}]: [D]
        [{relation=[{cd='MBR', desc='Member'}], childList=[A, B, C, D, E]}]: [E]
        [{relation=[{cd='CH', desc='Child'}], childList=[A, B, C]}, {relation=[{cd='SPS', desc='Spouse'}], childList=[A, B, C, D]}, {relation=[{cd='MBR', desc='Member'}], childList=[A, B, C, D, E]}]: [A, B, C]
    }
    
    Map<List<String>, List<String>> result = parentList.getMainList().stream()
            .flatMap(o -> o.getChildList().stream().map(c -> Map.entry(c, o.getRelation().get(0).getDesc())))
            .collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList())))
            .entrySet().stream()
            .collect(Collectors.groupingBy(Map.Entry::getValue, Collectors.mapping(Map.Entry::getKey, Collectors.toList())));
    
    {
        [Child, Spouse, Member]: [A, B, C]
        [Spouse, Member]: [D]
        [Member]: [E]
    }