今天来比较一下两个list,然后分别找出相同元素和不同元素的集合。
先上一个简单的示例:(注:因为测试数据量比较小,用ArrayList,如果涉及到百万数据的插入移除操作的话,用LinkedList)

[java] view plaincopy
  1. <span style="white-space:pre">    </span>   List<String> listA = new ArrayList<String>();
  2. List<String> listB = new ArrayList<String>();
  3. for(int i=0;i<6){
  4. listA.add(i+"");//0,1,2,3,4,5
  5. listB.add(i+1+"");//1,2,3,4,5,6
  6. }
  7. List<String> listC = getDifferListByLoop(listA,listB);//这里调用获取相同、不同元素集合的方法
  8. Object[] strArray =  listC.toArray();
  9. System.out.println("same ele is :  "+Arrays.toString(strArray));

首先,求出这两个集合的相同元素,第一个想法当然就是定义一个listC,然后两个AB集合分别循环取值判断,如果有相等的话,就放入这个listC。来,我们看看这个方案:

[java] view plaincopy
  1. /**
  2. * 双循环获取listA、listB的相同元素集合
  3. * @param listA
  4. * @param listB
  5. * @return list<String>
  6. */
  7. public static List<String> getSameListByLoop(List<String> listA,List<String> listB){
  8. long begin = System.nanoTime();//纳秒
  9. List<String> listC = new ArrayList<String>();
  10. for(String str :listA){
  11. if(listB.contains(str)){
  12. listC.add(str);
  13. }
  14. }
  15. long end = System.nanoTime();
  16. System.out.println("take  " + (end-begin) + " time ");
  17. return listC;
  18. }

输出:
take  79110 time 
same ele is :  [1, 2, 3, 4, 5]

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

[java] view plaincopy
  1. /**
  2. * 双循环获取listA、listB的不同元素集合
  3. * @param listA
  4. * @param listB
  5. * @return list<String>
  6. */
  7. public static List<String> getDifferListByLoop(List<String> listA,List<String> listB){
  8. long begin = System.nanoTime();//纳秒
  9. List<String> listC = new ArrayList<String>();
  10. for(String str :listA){
  11. if(!listB.contains(str)){
  12. listC.add(str);
  13. }
  14. }
  15. long end = System.nanoTime();
  16. System.out.println(" take " + (end-begin) + " time ");
  17. return listC;
  18. }

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

[java] view plaincopy
  1. for(String str :listB){
  2. if(!listA.contains(str)){
  3. listC.add(str);
  4. }
  5. }

这样就对了,输出:
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
  1. /**
  2. * 使用Map来获取listA、listB的不同元素集合
  3. * @param listA
  4. * @param listB
  5. * @return list<String>
  6. */
  7. public static List<String> getDifferListByMap(List<String> listA,List<String> listB){
  8. long begin = System.nanoTime();//纳秒
  9. List<String> listC = new ArrayList<String>();
  10. Map<String,Integer> map = new HashMap<String,Integer>();
  11. for(String strA:listA){
  12. map.put(strA, 1);
  13. }
  14. for(String strB:listB){
  15. Integer value = map.get(strB);
  16. if(value != null){
  17. map.put(strB, ++value);
  18. continue;
  19. }
  20. map.put(strB, 1);
  21. }
  22. for(Map.Entry<String, Integer> entry:map.entrySet()){
  23. if(entry.getValue()==1){//获取不同元素集合
  24. listC.add(entry.getKey());
  25. }
  26. }
  27. long end = System.nanoTime();
  28. System.out.println("take " + (end-begin) + " time ");
  29. return listC;  //亲测有效
  30. }

输出 :
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就可以了。

参考:
http://www.cnblogs.com/czpblog/archive/2012/08/06/2625794.html

never too late!

原文地址: https://blog.csdn.net/maoyeqiu/article/details/48750953

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

  1. js 快速找出两个数组中的不同元素或对象

    js 快速找出两个数组中的不同元素 var arr1 = [0,1,2,3,4,5]; var arr2 = [0,4,6,1,3,9]; function getArrDifference(arr1 ...

  2. 封装一个方法,找出数组中重复数大于n的元素集合

    例如 [1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4],封装一个数组原型上的方法,方法返回 重复数目大于2 的子元素集合,结果为[1, 2, 3] 初看并不难,循环一下就可以搞 ...

  3. win7为什么没有计算机,教你win7如何快速找出电脑没声音问题所在-win7之家

    在使用电脑的时候总是会遇到各种各样的问题,最近有不少用户发现电脑没声音,音箱和耳机都是没有声音的,这种现象是经常发生的事情,但是导致这种现象的原因也是很多的,如果要一一的排除的话又要浪费会很多时间又不 ...

  4. 第1章 游戏之乐——快速找出故障机器

    转载:编程之美_1.5_快速找出机器故障 题目:假设一个机器只存储一个标号为ID的记录,假设每份数据保存2个备份,这样就有2个机器存储了相同的数据.其中ID是小于10亿的整数 问题1.在某个时间,如果 ...

  5. 微软面试题:有100万个数字(1到9),其中只有1个数字重复2次,如何快速找出该数字

    /******************************************************************************* 文 件 名 : test100.cpp ...

  6. 表格字体缩小 php_如何快速找出两个Excel表格不同的地方?

    上一篇文章介绍了如何快速找出两个word文档不同的地方,这篇文章来说说如何快速找出两个Excel表格不同的地方,这里说的两个Excel表格,可以是同一个工作簿的不同sheet,也可以是两个不同的Exc ...

  7. 易语言取c盘文件夹中的文件被占用,win7系统怎么快速找出文件被什么进程占用|win7解除文件占用的方法...

    ‍‍ 很多时候我们想删除文件或文件夹的时候,会出现文件正在使用的提示导致文件无法删除,如果知道是什么程序在使用这个文件好,但多数时候我们并不知道是被什么程序占用,那么在win7系统怎么快速找出文件被什 ...

  8. 算法题008 快速找出故障机器

    快速找出故障机器 题目描述 关心数据挖掘和搜索引擎的程序员都知道,我们需要很多的计算机来存储和处理海量数据. 然而,计算机难免出现硬件故障而导致网络联系失败或死机.为了保证搜索引擎的服务质量,我们需要 ...

  9. 快速找出Linux服务器上不该存在恶意或后门文件

    转载来源 :如何快速找出Linux服务器上不该存在恶意或后门文件 :https://www.2cto.com/article/201805/748965.html 如何快速找出Linux服务器上不该存 ...

  10. 10杯水只有一滴有毒,用四只老鼠测试,二进制的方法快速找出哪瓶有毒;

    10杯水只有一滴有毒,用四只老鼠测试,二进制的方法快速找出哪瓶有毒: 分析,杯子1-10用二进制分别表示为 第一杯: 0000001 第二杯: 0000010 第三杯: 0000011 第四杯: 00 ...

最新文章

  1. 第2周项目2程序的多文件组织
  2. 关于Linux你了解多少?Linux由来!
  3. ipython怎么安装numpy_在TensorFlow教程中安装numpy后仍然无法导入
  4. 16张扎心漫画,戳中女生私密日常,每一幕都很真实
  5. python之装饰器详解
  6. rtt面向对象oopc——5.IO设备管理之快速查看设备父类调用设备子类的方法
  7. 深度学习入门:用MNIST完成Autoencoder(续)
  8. Android IOS WebRTC 音视频开发总结(二二)-- 多人视频架构模式
  9. Oracle宣布JDK 6死缓:计划赶不上变化
  10. RxBinding系列之RxTextView(二)
  11. Hibernate Search 教程
  12. 数字图像处理总复习讲义
  13. Learning records1:nltk安装的一些注意点(学习自用)
  14. 求最小公倍数的三种方法(C语言)
  15. Hashing(哈希)
  16. Android生日礼物(含拼图游戏,背景音乐,自动拨号等功能实现)--根据代码规范修改注释以及定义
  17. 计算机项目教学法探讨,基于项目教学法的非计算机专业计算机教学的设计和探讨...
  18. PPT转Word文档怎么转?分享一个巧妙的转换方法
  19. 红队笔记-1(主机发现,情报收集,内网信息收集)
  20. 【转】无法启动microsoft outlook 无法打开 outlook窗口 无法打开此文件夹集合 发生了意外错误...

热门文章

  1. CSS3 把整个网页设为灰色
  2. 黑客透过网络钓鱼邮件散播间谍程序 恐让商业机密外泄
  3. Unity零基础到入门 ☀️| Unity从青铜 到 王者!只差这篇让你学会Unity中最重要的部分——脚本组件✨
  4. 微信小程序中ajax同步请求方法[转载]
  5. C语言实现mkfs.vfat
  6. 智能路由心酸调优路——看推广代码简洁之道的重要性
  7. 科沃斯扫地机器人阿尔法_2019年扫地机器人战争收官之际,谈谈科沃斯的“龙头”逻辑...
  8. Renice红酒发布会预热,与NGK公链共同深耕红酒领域新生态
  9. A股2017十大TOP10,大数据榜单透视A股赚钱基因!
  10. mysql 建表建索引