JAVA获取两个List的交集、差集以及并集

本文详细介绍如何使用Java集合框架处理两个ArrayList的交集、差集及并集,通过具体实例演示了如何利用HashSet和LinkedList实现高效的数据操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

获取firstArrayList和secondArrayList的交集(两个集合相同的部分)、差集(两个集合不同的部分)以及并集(两个集合全并后的数据(不包含重复数据))。测试代码如下:

import java.util.Set;
import java.util.List;
import java.util.HashSet;
import java.util.TreeSet;
import java.util.Iterator;
import java.util.ArrayList;
import java.util.LinkedList;

public class getSet {
    
    public static void main(String args[]) {
        getList();
    }
    
    // 获取两个ArrayList的差集、交集、去重并集(数据量大小不限制)
    private static void getList() {
        List<String> firstArrayList = new ArrayList<String>();
        List<String> secondArrayList = new ArrayList<String>();
        List<String> defectList = new ArrayList<String>();//差集List
        List<String> collectionList = new ArrayList<String>();//交集List
        List<String> unionList = new ArrayList<String>();//去重并集List
        try {
            firstArrayList.add("aaa");
            firstArrayList.add("bbb");
            firstArrayList.add("ccc");
            firstArrayList.add("ddd");

            secondArrayList.add("bbb");
            secondArrayList.add("ccc");
            secondArrayList.add("eee");
            // 获取差集
            defectList = receiveDefectList(firstArrayList, secondArrayList);
            Iterator<String> defectIterator = defectList.iterator();
            System.out.println("===================差集===================");
            while(defectIterator.hasNext()) {
                System.out.println(defectIterator.next());
            }
            // 获取交集
            collectionList = receiveCollectionList(firstArrayList, secondArrayList);
            Iterator<String> collectionIterator = collectionList.iterator();
            System.out.println("===================交集===================");
            while(collectionIterator.hasNext()) {
                System.out.println(collectionIterator.next());
            }
            // 获取去重并集
            unionList = receiveUnionList(firstArrayList, secondArrayList);
            Iterator<String> unionIterator = unionList.iterator();
            System.out.println("===================去重并集===================");
            while(unionIterator.hasNext()) {
                System.out.println(unionIterator.next());
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * @方法描述:获取两个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>(firstSet);
        return resultList;
    }
}

转自:https://www.cnblogs.com/o0shine0o-zp/p/6902392.html

<think>首先,用户的问题是:“我想获取两个列表的交集 请问如何获取两个列表的交集”。这很直接:用户想知道如何在编程中获取两个列表的交集。 现在,系统级指令要: - 所有行内数学表达式必须使用 $...$ 格式,但这里的问题是关于列表交集的编程问题,不涉及数学表达式,所以可能不需要。 - 独立公式使用 $$...$$ 格式,但同样,这不相关。 - LaTeX 语法正确:确保任何数学部分正确,但这里没有数学。 - 使用中文回答。 - 生成相关问题:在回答后,添加相关问题部分。 - 回答中引用的段落末尾自然地添加引用标识,如 [^1]。 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 参考站内引用: - 引用 [^1]: Python 取交集的方法。 - 引用 [^2]: Java 使用流取交集。 - 引用 [^3]: Hutool 库取交集。 - 引用 [^4]: Python 取交集的实操代码。 用户的问题是关于获取两个列表的交集,所以我要覆盖多种编程语言的方法,因为引用提到了 Python 和 Java。 结构化回答: 1. **引言**:解释什么是列表交集。 2. **方法**:提供不同编程语言的方法。 - Python:使用 set 或内置函数。 - Java:使用合操作。 - 其他语言如使用库(如 Hutool)。 3. **示例代码**:提供代码片段。 4. **注意事项**:比如处理重复元素、性能等。 5. **结尾**:总结。 6. **相关问题**:生成相关问题。 引用处理:在回答中,如果引用信息,末尾添加引用标识。例如,提到 Python 方法时,引用 [^1] 或 [^4]。 确保回答真实可靠:基于常见编程知识。 最终输出格式: - 回答部分。 - 相关问题部分。 相关问题生成:基于主题,如性能优化、应用场景等。参考系统指令的示例:快速排序后的问题。 相关问题想法: 1. 如何获取多个列表的交集? 2. 如何优化获取交集的性能? 3. 交集在数据处理中的常见应用场景? 4. 如何处理大型列表的交集计算? 5. 在哪些编程语言中获取交集最方便? 现在,用中文构建回答。</think>### 如何获取两个列表的交集 在编程中,获取两个列表的交集是指找出它们共有的元素。这是一个常见的数据处理任务,适用于多种编程语言。下面我将逐步解释实现方法,提供示例代码。关键点包括: - **交集定义**:如果列表 A 和 B 的交集是 C,则 C 包含所有同时出现在 A 和 B 中的元素。 - **注意事项**:列表可能包含重复元素,但交集通常只保留唯一值(除非特别处理)。性能上,使用合(Set)比遍历列表更高效,时间复杂度接近 $O(n)$。 #### 1. **Python 实现方法** Python 是最简洁的语言之一,推荐使用内置的 `set` 类型或 `intersection` 方法。引用 [^1] 和 [^4] 提供了基础方法: - **使用 set 转换**:将列表转换为合,然后取交集。 - **示例代码**: ```python # 定义两个列表 list1 = [1, 2, 3, 4, 5] list2 = [4, 5, 6, 7, 8] # 方法1: 使用 set 和 & 运算符 intersection_set = set(list1) & set(list2) print(list(intersection_set)) # 输出: [4, 5] # 方法2: 使用 intersection 方法 intersection_list = list(set(list1).intersection(list2)) print(intersection_list) # 输出: [4, 5] ``` - **优点**:代码简洁,高效处理大型列表。 - **缺点**:合会自动去重,如果需保留重复元素,需额外处理,如使用列表推导式。 #### 2. **Java 实现方法** Java 中可以使用 `HashSet` 或流(Stream)API 来获取交集。引用 [^2] 展示了流式处理: - **使用 HashSet**:利用合的 `retainAll` 方法。 - **使用 Stream API**:Java 8 及以上版本支持函数式编程。 - **示例代码**: ```java import java.util.*; import java.util.stream.Collectors; public class ListIntersection { public static void main(String[] args) { List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5); List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8); // 方法1: 使用 HashSet Set<Integer> set1 = new HashSet<>(list1); Set<Integer> set2 = new HashSet<>(list2); set1.retainAll(set2); // 修改 set1 为交集 System.out.println(set1); // 输出: [4, 5] // 方法2: 使用 Stream (推荐,更简洁) Set<Integer> intersection = list1.stream() .filter(list2::contains) .collect(Collectors.toSet()); System.out.println(intersection); // 输出: [4, 5] } } ``` - **优点**:Stream API 可读性强,适合链式操作。 - **缺点**:`retainAll` 会修改原合,需注意副作用。 #### 3. **其他语言或库方法** - **Hutool 库(Java)**:如果使用第三方库,Hutool 提供了简单方法。引用 [^3] 提到 `CollUtil.intersection`: ```java import cn.hutool.core.collection.CollUtil; import java.util.List; import java.util.Arrays; List<Integer> list1 = Arrays.asList(1, 2, 3, 4); List<Integer> list2 = Arrays.asList(3, 4, 5, 6); List<Integer> intersection = CollUtil.intersection(list1, list2); System.out.println(intersection); // 输出: [3, 4] ``` - **JavaScript**:使用数组的 `filter` 和 `includes` 方法: ```javascript const list1 = [1, 2, 3, 4]; const list2 = [3, 4, 5, 6]; const intersection = list1.filter(item => list2.includes(item)); console.log(intersection); // 输出: [3, 4] ``` #### 4. **通用建议** - **性能优化**:对于大型列表,优先使用合(如 Python 的 `set` 或 Java 的 `HashSet`),因为合的查找操作是 $O(1)$,而列表遍历是 $O(n^2)$。例如,在 Python 中,`set` 转换比嵌套循环快得多。 - **处理特殊情况**: - 如果列表有重复元素,交集默认只保留唯一值。如需保留重复,可改用列表推导式(如 Python:`[x for x in list1 if x in list2]`),但性能较差。 - 确保元素类型一致(如数字或字符串),避免类型错误。 - **应用场景**:交集常用于数据分析(如用户行为日志去重)、数据库查询优化或算法设计(如推荐系统中的共同兴趣匹配)[^1]。 总之,Python 和 Java 是最常用的实现语言,推荐优先使用内置合操作以提高效率。如果您有特定语言需,可以提供更多细节,我可以给出更针对性的代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值