
我们知道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
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)