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;
    }
复制代码

 

posted @   幽灵中的野孩子  阅读(4616)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示