快速找出List集合的相同与不同元素集合
今天来比较一下两个list,然后分别找出相同元素和不同元素的集合。
先上一个简单的示例:(注:因为测试数据量比较小,用ArrayList,如果涉及到百万数据的插入移除操作的话,用LinkedList)
- <span style="white-space:pre"> </span> List<String> listA = new ArrayList<String>();
- List<String> listB = new ArrayList<String>();
- for(int i=0;i<6){
- listA.add(i+"");//0,1,2,3,4,5
- listB.add(i+1+"");//1,2,3,4,5,6
- }
- List<String> listC = getDifferListByLoop(listA,listB);//这里调用获取相同、不同元素集合的方法
- Object[] strArray = listC.toArray();
- System.out.println("same ele is : "+Arrays.toString(strArray));
首先,求出这两个集合的相同元素,第一个想法当然就是定义一个listC,然后两个AB集合分别循环取值判断,如果有相等的话,就放入这个listC。来,我们看看这个方案:
- /**
- * 双循环获取listA、listB的相同元素集合
- * @param listA
- * @param listB
- * @return list<String>
- */
- public static List<String> getSameListByLoop(List<String> listA,List<String> listB){
- long begin = System.nanoTime();//纳秒
- List<String> listC = new ArrayList<String>();
- for(String str :listA){
- if(listB.contains(str)){
- listC.add(str);
- }
- }
- long end = System.nanoTime();
- System.out.println("take " + (end-begin) + " time ");
- return listC;
- }
输出:
take 79110 time
same ele is : [1, 2, 3, 4, 5]
输出没有问题。同理,如果是求出不同元素的话,也是定义一个ListC,遍历循环listA和listB,把不相等的值放入listC,如下:
- /**
- * 双循环获取listA、listB的不同元素集合
- * @param listA
- * @param listB
- * @return list<String>
- */
- public static List<String> getDifferListByLoop(List<String> listA,List<String> listB){
- long begin = System.nanoTime();//纳秒
- List<String> listC = new ArrayList<String>();
- for(String str :listA){
- if(!listB.contains(str)){
- listC.add(str);
- }
- }
- long end = System.nanoTime();
- System.out.println(" take " + (end-begin) + " time ");
- return listC;
- }
输出:
take 50032 time
different ele is : [0]
哎?输出应该是[0,6]才对呀,哦,不对,求不同元素的时候只遍历了listA,判断了ListB中是否包含ListA的元素,如果listB中有的元素不在ListA中,是判断不出来的。因此,还要再加一段:
- for(String str :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为该元素出现的次数。如下:
- /**
- * 使用Map来获取listA、listB的不同元素集合
- * @param listA
- * @param listB
- * @return list<String>
- */
- public static List<String> getDifferListByMap(List<String> listA,List<String> listB){
- long begin = System.nanoTime();//纳秒
- List<String> listC = new ArrayList<String>();
- Map<String,Integer> map = new HashMap<String,Integer>();
- for(String strA:listA){
- map.put(strA, 1);
- }
- for(String strB:listB){
- Integer value = 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());
- }
- }
- long end = System.nanoTime();
- System.out.println("take " + (end-begin) + " time ");
- return listC; //亲测有效
- }
输出 :
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集合的相同与不同元素集合相关推荐
- js 快速找出两个数组中的不同元素或对象
js 快速找出两个数组中的不同元素 var arr1 = [0,1,2,3,4,5]; var arr2 = [0,4,6,1,3,9]; function getArrDifference(arr1 ...
- 封装一个方法,找出数组中重复数大于n的元素集合
例如 [1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4],封装一个数组原型上的方法,方法返回 重复数目大于2 的子元素集合,结果为[1, 2, 3] 初看并不难,循环一下就可以搞 ...
- win7为什么没有计算机,教你win7如何快速找出电脑没声音问题所在-win7之家
在使用电脑的时候总是会遇到各种各样的问题,最近有不少用户发现电脑没声音,音箱和耳机都是没有声音的,这种现象是经常发生的事情,但是导致这种现象的原因也是很多的,如果要一一的排除的话又要浪费会很多时间又不 ...
- 第1章 游戏之乐——快速找出故障机器
转载:编程之美_1.5_快速找出机器故障 题目:假设一个机器只存储一个标号为ID的记录,假设每份数据保存2个备份,这样就有2个机器存储了相同的数据.其中ID是小于10亿的整数 问题1.在某个时间,如果 ...
- 微软面试题:有100万个数字(1到9),其中只有1个数字重复2次,如何快速找出该数字
/******************************************************************************* 文 件 名 : test100.cpp ...
- 表格字体缩小 php_如何快速找出两个Excel表格不同的地方?
上一篇文章介绍了如何快速找出两个word文档不同的地方,这篇文章来说说如何快速找出两个Excel表格不同的地方,这里说的两个Excel表格,可以是同一个工作簿的不同sheet,也可以是两个不同的Exc ...
- 易语言取c盘文件夹中的文件被占用,win7系统怎么快速找出文件被什么进程占用|win7解除文件占用的方法...
很多时候我们想删除文件或文件夹的时候,会出现文件正在使用的提示导致文件无法删除,如果知道是什么程序在使用这个文件好,但多数时候我们并不知道是被什么程序占用,那么在win7系统怎么快速找出文件被什 ...
- 算法题008 快速找出故障机器
快速找出故障机器 题目描述 关心数据挖掘和搜索引擎的程序员都知道,我们需要很多的计算机来存储和处理海量数据. 然而,计算机难免出现硬件故障而导致网络联系失败或死机.为了保证搜索引擎的服务质量,我们需要 ...
- 快速找出Linux服务器上不该存在恶意或后门文件
转载来源 :如何快速找出Linux服务器上不该存在恶意或后门文件 :https://www.2cto.com/article/201805/748965.html 如何快速找出Linux服务器上不该存 ...
- 10杯水只有一滴有毒,用四只老鼠测试,二进制的方法快速找出哪瓶有毒;
10杯水只有一滴有毒,用四只老鼠测试,二进制的方法快速找出哪瓶有毒: 分析,杯子1-10用二进制分别表示为 第一杯: 0000001 第二杯: 0000010 第三杯: 0000011 第四杯: 00 ...
最新文章
- 第2周项目2程序的多文件组织
- 关于Linux你了解多少?Linux由来!
- ipython怎么安装numpy_在TensorFlow教程中安装numpy后仍然无法导入
- 16张扎心漫画,戳中女生私密日常,每一幕都很真实
- python之装饰器详解
- rtt面向对象oopc——5.IO设备管理之快速查看设备父类调用设备子类的方法
- 深度学习入门:用MNIST完成Autoencoder(续)
- Android IOS WebRTC 音视频开发总结(二二)-- 多人视频架构模式
- Oracle宣布JDK 6死缓:计划赶不上变化
- RxBinding系列之RxTextView(二)
- Hibernate Search 教程
- 数字图像处理总复习讲义
- Learning records1:nltk安装的一些注意点(学习自用)
- 求最小公倍数的三种方法(C语言)
- Hashing(哈希)
- Android生日礼物(含拼图游戏,背景音乐,自动拨号等功能实现)--根据代码规范修改注释以及定义
- 计算机项目教学法探讨,基于项目教学法的非计算机专业计算机教学的设计和探讨...
- PPT转Word文档怎么转?分享一个巧妙的转换方法
- 红队笔记-1(主机发现,情报收集,内网信息收集)
- 【转】无法启动microsoft outlook 无法打开 outlook窗口 无法打开此文件夹集合 发生了意外错误...
热门文章
- CSS3 把整个网页设为灰色
- 黑客透过网络钓鱼邮件散播间谍程序 恐让商业机密外泄
- Unity零基础到入门 ☀️| Unity从青铜 到 王者!只差这篇让你学会Unity中最重要的部分——脚本组件✨
- 微信小程序中ajax同步请求方法[转载]
- C语言实现mkfs.vfat
- 智能路由心酸调优路——看推广代码简洁之道的重要性
- 科沃斯扫地机器人阿尔法_2019年扫地机器人战争收官之际,谈谈科沃斯的“龙头”逻辑...
- Renice红酒发布会预热,与NGK公链共同深耕红酒领域新生态
- A股2017十大TOP10,大数据榜单透视A股赚钱基因!
- mysql 建表建索引