快速找出List集合的相同与不同元素集合
2016-08-03 10:26
831 查看
今天来比较一下两个list,然后分别找出相同元素和不同元素的集合。
先上一个简单的示例:(注:因为测试数据量比较小,用ArrayList,如果涉及到百万数据的插入移除操作的话,用LinkedList)
take 79110 time
same ele is : [1, 2, 3, 4, 5]
输出没有问题。同理,如果是求出不同元素的话,也是定义一个ListC,遍历循环listA和listB,把不相等的值放入listC,如下:
take 50032 time
different ele is : [0]
哎?输出应该是[0,6]才对呀,哦,不对,求不同元素的时候只遍历了listA,判断了ListB中是否包含ListA的元素,如果listB中有的元素不在ListA中,是判断不出来的。因此,还要再加一段:
take 56019 time
different ele is : [0, 6]
这样是不是就行了呢,当然不行。
我们知道,一般业务场景下list集合里可能会有大量的数据,如果连用两个循环遍历(contains的操作也是for循环遍历),时间复杂度是O(m*n)[m,n分别是listA、listB的长度],可想而知,效率很低下。那么怎么解决这个问题呢?
想一下,是不是可以用Map来解决这个问题呢?如果把这两个list的值分别作为Map的key值,value为该元素出现的次数。如下:
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!
先上一个简单的示例:(注:因为测试数据量比较小,用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!
相关文章推荐
- java找出2个集合相同和不同的元素(以及去除List中的重复元素)
- java找出2个集合或数组相同和不同的元素(以及去除List中的重复元素)
- java找出2个集合相同和不同的元素(以及去除List中的重复元素)
- java找出2个集合相同和不同的元素(以及去除List中的重复元素)
- 使用Lamdba 表达式 从A集合中去除不存在于B集合的元素加入到C集合中(快速找出两个集合中不同的元素)
- 找出List集合中不同的元素的方法
- 找出list中的不同元素、删除两个list中相同的对象
- 关于两个List如何快速高效去除相同的元素,保留不同的元素
- 找出list中的不同元素、删除两个list中相同的对象
- 有List<String> list1和List<String> list2,两个集合各有上万个元素,怎样高效取出两个集合中不同的元素?
- 面试题——找出数组中不相同的所有元素(是数组,不是集合)
- java List Map数据对比 找出相同和不同的内容
- JAVA两个数组间元素的比较(找出相同或者不同元素)
- List集合去除相同元素
- 高效的找出两个List中的不同元素
- 高效的找出两个List中的不同元素
- java两个list中保存bean对象,找出其中某一属性不同的元素
- 两个有序整形数组找出二者相同的元素和不同的元素
- 取得两个集合中不同元素(去除两个集合中的相同元素)
- 从“比较两个含有多个不同元素的集合是否相同”引申出的几种算法