300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 快速找出List集合的相同与不同元素集合

快速找出List集合的相同与不同元素集合

时间:2019-02-23 20:56:09

相关推荐

快速找出List集合的相同与不同元素集合

今天来比较一下两个list,然后分别找出相同元素和不同元素的集合。

先上一个简单的示例:(注:因为测试数据量比较小,用ArrayList,如果涉及到百万数据的插入移除操作的话,用LinkedList)

[java]view plaincopy<spanstyle="white-space:pre"></span>List<String>listA=newArrayList<String>();List<String>listB=newArrayList<String>();for(inti=0;i<6){listA.add(i+"");//0,1,2,3,4,5listB.add(i+1+"");//1,2,3,4,5,6}List<String>listC=getDifferListByLoop(listA,listB);//这里调用获取相同、不同元素集合的方法Object[]strArray=listC.toArray();System.out.println("sameeleis:"+Arrays.toString(strArray));首先,求出这两个集合的相同元素,第一个想法当然就是定义一个listC,然后两个AB集合分别循环取值判断,如果有相等的话,就放入这个listC。来,我们看看这个方案:

[java]view plaincopy/***双循环获取listA、listB的相同元素集合*@paramlistA*@paramlistB*@returnlist<String>*/publicstaticList<String>getSameListByLoop(List<String>listA,List<String>listB){longbegin=System.nanoTime();//纳秒List<String>listC=newArrayList<String>();for(Stringstr:listA){if(listB.contains(str)){listC.add(str);}}longend=System.nanoTime();System.out.println("take"+(end-begin)+"time");returnlistC;}输出:

take 79110 time

same ele is : [1, 2, 3, 4, 5]

输出没有问题。同理,如果是求出不同元素的话,也是定义一个ListC,遍历循环listA和listB,把不相等的值放入listC,如下:

[java]view plaincopy/***双循环获取listA、listB的不同元素集合*@paramlistA*@paramlistB*@returnlist<String>*/publicstaticList<String>getDifferListByLoop(List<String>listA,List<String>listB){longbegin=System.nanoTime();//纳秒List<String>listC=newArrayList<String>();for(Stringstr:listA){if(!listB.contains(str)){listC.add(str);}}longend=System.nanoTime();System.out.println("take"+(end-begin)+"time");returnlistC;}输出:

take 50032 time

different ele is : [0]

哎?输出应该是[0,6]才对呀,哦,不对,求不同元素的时候只遍历了listA,判断了ListB中是否包含ListA的元素,如果listB中有的元素不在ListA中,是判断不出来的。因此,还要再加一段:

[java]view plaincopyfor(Stringstr:listB){if(!listA.contains(str)){listC.add(str);}}这样就对了,输出:

take 56019 time

different ele is : [0, 6]

这样是不是就行了呢,当然不行。

我们知道,一般业务场景下list集合里可能会有大量的数据,如果连用两个循环遍历(contains的操作也是for循环遍历),时间复杂度是O(m*n)[m,n分别是listA、listB的长度],可想而知,效率很低下。那么怎么解决这个问题呢?

想一下,是不是可以用Map来解决这个问题呢?如果把这两个list的值分别作为Map的key值,value为该元素出现的次数。如下:

[java]view plaincopy/***使用Map来获取listA、listB的不同元素集合*@paramlistA*@paramlistB*@returnlist<String>*/publicstaticList<String>getDifferListByMap(List<String>listA,List<String>listB){longbegin=System.nanoTime();//纳秒List<String>listC=newArrayList<String>();Map<String,Integer>map=newHashMap<String,Integer>();for(StringstrA:listA){map.put(strA,1);}for(StringstrB:listB){Integervalue=map.get(strB);if(value!=null){map.put(strB,++value);continue;}map.put(strB,1);}for(Map.Entry<String,Integer>entry:map.entrySet()){if(entry.getValue()==1){//获取不同元素集合listC.add(entry.getKey());}}longend=System.nanoTime();System.out.println("take"+(end-begin)+"time");returnlistC; //亲测有效}输出 :

take 564456 time

different ele is : [0, 6]

当数据量大的时候时间明显时间要小很多,可以把list里的i换成10000,前后两种求不同元素的方法输出时间为:

第一种:take 585109053 time

different ele is : [0, 10000]

第二种:take 31576607 time

different ele is : [0, 10000]

差异就明显了。同理,求出相同元素的集合只要value!=1就可以了。

参考:

/czpblog/archive//08/06/2625794.html

never too late!

原文地址: /maoyeqiu/article/details/48750953

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。