我想使用
java8流合并内部列表,如下所示:
什么时候
List> mainList = new ArrayList>();
mainList.add(Arrays.asList(0,1));
mainList.add(Arrays.asList(0,1,2));
mainList.add(Arrays.asList(1,2));
mainList.add(Arrays.asList(3));
应该合并成
[[0,1,2],[3]];
什么时候
List> mainList = new ArrayList>();
mainList.add(Arrays.asList(0,2));
mainList.add(Arrays.asList(1,4));
mainList.add(Arrays.asList(0,2,4));
mainList.add(Arrays.asList(3,4));
mainList.add(Arrays.asList(1,3,4));
应该合并成
[[0,1,2,3,4]];
到目前为止,这是我所做的
static void mergeCollections(List> collectionTomerge) {
boolean isMerge = false;
List> mergeCollection = new ArrayList>();
for (List listInner : collectionTomerge) {
List mergeAny = mergeCollection.stream().map(
lc -> lc.stream().filter(listInner::contains)
).findFirst()
.orElse(null)
.collect(Collectors.toList());
}
}
但我得到这个例外:
Exception in thread "main" java.lang.NullPointerException
at linqArraysOperations.LinqOperations.mergeCollections(LinqOperations.java:87)
更新了我的答案版本
这就是我想要实现的目标,但Tagir的好回答是没有递归
我通过使用Tagir回答没有平面地图的逻辑,在Mikhaal的回答中做了一些改变
public static List> combineList(List> argList) {
boolean isMerge = false;
List> result = new ArrayList<>();
for (List list : argList) {
List> mergedFound =
result.stream()
.filter(mt->list.stream().anyMatch(mt::contains))
.map(
t -> Stream.concat(t.stream(),list.stream()).distinct()
.collect(Collectors.toList())
)
.collect(Collectors.toList());
//if(mergedFound !=null && ( mergedFound.size() > 0 && mergedFound.stream().findFirst().get().size() > 0 )){
if(mergedFound !=null && mergedFound.size() > 0 && ){
result = Stream.concat(result.stream().filter(t->list.stream().noneMatch(t::contains)),mergedFound.stream()).distinct().collect(Collectors.toList());
isMerge = true;
}
else
result.add(list);
}
if(isMerge && result.size() > 1)
return combineList(result);
return result;
}