在Java中比较2个以上的列表(动态决定列表数量)
以上代码是ans的第一步。因此,我得到了我在评论中提到的错误 希望输出如下所示:在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)))
您可以使用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]
}