Java 内部表_java-8 – 使用java8 Streams合并列表中的内部列表

我想使用

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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值