找出List集合中不同的元素的方法
来源:互联网 发布:道萨迪亚斯矩阵 编辑:程序博客网 时间:2024/06/05 03:44
这几天在写代码时候用到了关于ArrayList的一些算法,在这里整理一下。有点小感悟:现在逐渐明白为什么大公司对算法的要求这么高,在写代码逻辑的时候就是用算法处理,而算法的效率的高低直接决定了你程序的运行性能,看来在以后的训练中药加强对算法的训练呀。
首先看一下CollectionUtils这个Collection工具类对list的一些处理,摘了别人的代码,把运行结果贴出来:
package com.web.test;import java.util.ArrayList;import java.util.Collection;import java.util.Collections;import java.util.List;import org.apache.commons.collections.CollectionUtils;import org.apache.commons.lang.ArrayUtils;public class CollectionUtilsTest { @SuppressWarnings("unchecked") public static void main(String[] args) { List<String> aList = new ArrayList<String>(); aList.add("aaa"); aList.add("bbb"); aList.add("ccc"); List<String> bList = new ArrayList<String>(); bList.add("aaa"); bList.add("ddd"); bList.add("eee"); // 并集 Collection<String> unionList = CollectionUtils.union(aList, bList); // 交集 Collection<String> intersectionList = CollectionUtils.intersection(aList, bList); // 是否存在交集 boolean isContained = CollectionUtils.containsAny(aList, bList); // 交集的补集 Collection<String> disjunctionList = CollectionUtils.disjunction(aList, bList); // 集合相减 Collection<String> subtractList = CollectionUtils.subtract(aList, bList); // 排序 Collections.sort((List<String>) unionList); Collections.sort((List<String>) intersectionList); Collections.sort((List<String>) disjunctionList); Collections.sort((List<String>) subtractList); // 测试 System.out.println("A: " + ArrayUtils.toString(aList.toArray())); System.out.println("B: " + ArrayUtils.toString(bList.toArray())); System.out.println("A has one of B? : " + isContained); System.out.println("Union(A, B): " + ArrayUtils.toString(unionList.toArray())); System.out.println("Intersection(A, B): "+ ArrayUtils.toString(intersectionList.toArray())); System.out.println("Disjunction(A, B): " + ArrayUtils.toString(disjunctionList.toArray())); System.out.println("Subtract(A, B): "+ ArrayUtils.toString(subtractList.toArray())); }}
结果:
现在看一下他的源码实现:
首先是union:
public static Collection union(final Collection a, final Collection b) { ArrayList list = new ArrayList(); Map mapa = getCardinalityMap(a); Map mapb = getCardinalityMap(b); Set elts = new HashSet(a); elts.addAll(b); Iterator it = elts.iterator(); while(it.hasNext()) { Object obj = it.next(); for(int i=0,m=Math.max(getFreq(obj,mapa),getFreq(obj,mapb));i<m;i++) { list.add(obj); } } return list; }
再是intersection:
public static Collection intersection(final Collection a, final Collection b) { ArrayList list = new ArrayList(); Map mapa = getCardinalityMap(a); Map mapb = getCardinalityMap(b); Set elts = new HashSet(a); elts.addAll(b); Iterator it = elts.iterator(); while(it.hasNext()) { Object obj = it.next(); for(int i=0,m=Math.min(getFreq(obj,mapa),getFreq(obj,mapb));i<m;i++) { list.add(obj); } } return list; }
对于交集的处理同样也是基于set和map的。关于其他实现,大家可以参照源码,从上边这两段代码来看,效率并不高毕竟它是相当于遍历两个list,时间复杂度应该是n*n。需要说明的是这些方法都是数学的集合算法。
对于比较两个链表可以在ArrayList中处理,也可以在HashMap中处理,现在给出这两中处理方式:
import java.util.Collection;import java.util.ArrayList;import java.util.Arrays;public class Repeated { public static void main( String [] args ) { Collection listOne = new ArrayList(Arrays.asList("milan","dingo", "elpha", "hafil", "meat", "iga", "neeta.peeta")); Collection listTwo = new ArrayList(Arrays.asList("hafil", "iga", "binga", "mike", "dingo")); listOne.retainAll( listTwo ); System.out.println( listOne ); }}
这里用到的是retainAll函数,它的作用是两个集合求交集,只保留交集数据 ,在set中有个名字类似的函数交addAll(Collection c) ,它的作用是将c中所有元素添加到一个Set中,如果Set中已有某一元素,则不添加,因Set不允许有重复值。
再看一下HashMap的处理方式:
import java.util.Collection;import java.util.HashSet;import java.util.Arrays;class Repeated { public static void main( String [] args ) { Collection<String> listOne = Arrays.asList("milan","iga","dingo","iga","elpha","iga"); Collection<String> listTwo = Arrays.asList("hafil", "iga","dingo","dingo","dingo"); Collection<String> similar = new HashSet<String>( listOne ); Collection<String> different = new HashSet<String>(); different.addAll( listOne ); different.addAll( listTwo ); similar.retainAll( listTwo ); different.removeAll( similar ); System.out.printf(listOne, listTwo, similar, different); }}
这就是利用了set集合中元素是不同的来处理这个问题的。
或者不用集合,自己直接对这两个list进行处理:
private static ArrayList<String> getSame(ArrayList<String> list1, ArrayList<String> list2){ ArrayList<String> diff = new ArrayList<String>(); for(String str:list1){ if(list2.contains(str)) { diff.add(str); } } return diff; }
这里有一篇讲集合非常好的文章,大家可以参考一下https://www3.ntu.edu.sg/home/ehchua/programming/java/J5c_Collection.html
0 0
- 找出List集合中不同的元素的方法
- 快速找出List集合的相同与不同元素集合
- 高效找出两个List中不同的元素
- java找出2个集合相同和不同的元素(以及去除List中的重复元素)
- java找出2个集合相同和不同的元素(以及去除List中的重复元素)
- java找出2个集合相同和不同的元素(以及去除List中的重复元素)
- 找出list中的不同元素、删除两个list中相同的对象
- 找出两个数组中不同的元素
- 高效的找出两个List中的不同元素
- 高效的找出两个List中的不同元素
- 高效的找出两个List中的不同元素
- 高效的找出两个List中的不同元素
- 高效的找出两个List中的不同元素
- 高效的找出两个List中的不同元素
- 高效的找出两个List中的不同元素
- 使用Lamdba 表达式 从A集合中去除不存在于B集合的元素加入到C集合中(快速找出两个集合中不同的元素)
- 【翻译】Java中遍历集合元素的不同方法
- 获取list集合中重复的元素
- 【贪心算法,区间覆盖】:poj1089,Intervals
- PHP上传大文件之前检查文件大小方法
- 单例模式——不必多记,只记所需
- PHP开发工具ZendStudio_6.1乱码解决终极方法
- 欢迎使用CSDN-markdown编辑器
- 找出List集合中不同的元素的方法
- JavaScript高级程序设计之基本概念之操作符之布尔操作符第3.5.3讲笔记
- JS-SDK设置安全域名
- 编程练习(2)
- angularjs结合bootstrap--进度条progressBar
- Introduction to Java Programming编程题11.1<The triangle class>
- SpriteBuilder切换解决方案以及CCB的修改与保存
- 低压mos大全
- 我的Unity项目遇到的坑