List交集、并集、补集、差集
最近回看了一下List的基础,目前网上主流得对List交并补差有两种方式
交集
交集就是两个集合都有的部分 listA{ 1,2,3,4 } listB{2,3,4,5} 那A交B结果就是{2,3,4}
并集
并集就是将两个集合中所有的元素加在一起 listA{ 1,2,3,4 } listB{2,3,4,5} 那么A并B结果就是{1,2,2,3,3,4,4,5}
差集
差集就是两集合元素相减,只保留前面集合中剩下的元素 listA{ 1,2,3,4 } listB{2,3,4,5} 那么A差B结果{1} 如果B差A 那么结果{5}
补集
我对补集的理解有点偏,但是比较好记,高中的时候就这么记得, A补B listA{ 1,2,3,4 } listB{2,3,4,5} 结果{5} 其实就是B差A 读法:A关于B的相对补集是{5}
B补A 结果{1} 读法B关于A的补集是{1}
第一种:CollectionUtils工具包中的四个方法;该类所在包org.apache.commons.collections.CollectionUtils
//并集 CollectionUtils.union(a, b); //交集 CollectionUtils.intersection(a, b); //交集的补集 CollectionUtils.disjunction(a, b); //集合相减 CollectionUtils.subtract(a, b);
第二种:直接调用List中的方法
A交B
listA.retainAll(listB);
A并B
listA.addAll(listB);
A减去B
listA.removeAll(listB);
上述的只是基础类型的排序String,Integer等,如果涉及到工作上业务实体类的时候需要在实体类中重写 equals(
@Override public boolean equals(Object obj) { return true; } @Override public int hashCode() { return 0; } 根据具体业务写equals()方法和hasCode()方法
上面方法只适合少量数据操作,大量数据操作会非常慢,如果碰到大量数据,求交并补的话,还是要自己通过set集合自己些方法 ,大量数据还要看下面的,通过set来进行操作
/** * @方法描述:获取两个ArrayList的差集 * @param firstArrayList 第一个ArrayList * @param secondArrayList 第二个ArrayList * @return resultList 差集ArrayList */ public static List<String> receiveDefectList(List<String> firstArrayList, List<String> secondArrayList) { List<String> resultList = new ArrayList<String>(); LinkedList<String> result = new LinkedList<String>(firstArrayList);// 大集合用linkedlist HashSet<String> othHash = new HashSet<String>(secondArrayList);// 小集合用hashset Iterator<String> iter = result.iterator();// 采用Iterator迭代器进行数据的操作 while(iter.hasNext()){ if(othHash.contains(iter.next())){ iter.remove(); } } resultList = new ArrayList<String>(result); return resultList; } /** * @方法描述:获取两个ArrayList的交集 * @param firstArrayList 第一个ArrayList * @param secondArrayList 第二个ArrayList * @return resultList 交集ArrayList */ public static List<String> receiveCollectionList(List<String> firstArrayList, List<String> secondArrayList) { List<String> resultList = new ArrayList<String>(); LinkedList<String> result = new LinkedList<String>(firstArrayList);// 大集合用linkedlist HashSet<String> othHash = new HashSet<String>(secondArrayList);// 小集合用hashset Iterator<String> iter = result.iterator();// 采用Iterator迭代器进行数据的操作 while(iter.hasNext()) { if(!othHash.contains(iter.next())) { iter.remove(); } } resultList = new ArrayList<String>(result); return resultList; } /** * @方法描述:获取两个ArrayList的去重并集 * @param firstArrayList 第一个ArrayList * @param secondArrayList 第二个ArrayList * @return resultList 去重并集ArrayList */ public static List<String> receiveUnionList(List<String> firstArrayList, List<String> secondArrayList) { List<String> resultList = new ArrayList<String>(); Set<String> firstSet = new TreeSet<String>(firstArrayList); for(String id : secondArrayList) { // 当添加不成功的时候 说明firstSet中已经存在该对象 firstSet.add(id); } resultList = new ArrayList<String>(dawjidSet); return resultList; }

浙公网安备 33010602011771号