大数据量时取两个List的交集和并集

大数据量时取两个List的交集和并集,第1张

对于list1和list2,需要求这两个list的交集和并集 *** 作

我们知道list本身自带了retainAll来实现   list1.retainAll(list2)

这种方式在list都比较小的情况下还是可以接受的,但是在大数据量时,这种就速度比较慢了,40万数据量大概需要10分钟,所以需要考虑另外一种方式去处理

在jdk1.8中,有一种方式是通过stream流的处理把list转换成map,再对map进行处理,我们知道,map的底层都是数组加链表的形式来实现的,通常情况下,它的查找效率和写入效率都是O(1)的

map = list.stream().collect(Collectors.toMap((key值)bean::getOrderNo, (这块存value值)bean ->bean))

然后再对map进行处理,有一个需要注意的就是转换的时候需要保证list中的值必须非空,并且没有重复数据

public List<Integer>listCross(List<Integer>list0,List<Integer>list1)

{

//先遍历size小的list每个元素(这个list设为la 另一个lb),遍历时与另个list中元素比较,找到相同的元素,因为是排序的,假设为升序。la中每下一个元素都不必与lb的第一个开始比较,而是接着上个元素比较完之后的剩余元素直至相同

List<Integer>la=list0

List<Integer>lb=list1

List<Integer>lc=new ArrayList<Integer>()

int a=list0.size()

int b=list1.size()

int bs=b//size of the longer list

if(a>b){

la=list1lb=list0

bs=a

}

int c=0//与lb中哪个元素开始比较

for(Integer i:la)

{

for(int k=ck<bsk++)

{

if(lb.get(k)>i)break//lb.get(k)大于i 则lb的下一个元素也只会比i大所以

//就不用再执行了

if(lb.get(k)==i)//cross

{

c=k+1//这个地方比较重要,lb中下次就c以前的就不用比较 了

lc.add(i)

break

}//if

}//for

}//for

return lc

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/yw/8905268.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-22
下一篇2023-04-22

发表评论

登录后才能评论

评论列表(0条)

    保存