两个list集合取重复数据

假设我们有两个 List,list1 和 list2,它们包含一些元素。以下是不同的实现方式:

  1. 获取两个 List 的交集

交集是指两个列表中都存在的元素,可以使用 retainAll 方法。

示例代码:

java 复制代码
import java.util.ArrayList;
import java.util.List;

public class ListIntersection {
    public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = new ArrayList<>();
        
        list1.add(1);
        list1.add(2);
        list1.add(3);
        list1.add(4);
        
        list2.add(3);
        list2.add(4);
        list2.add(5);
        list2.add(6);
        
        // 获取交集
        list1.retainAll(list2);
        
        System.out.println("交集: " + list1); // 输出 [3, 4]
    }
}

解释:

复制代码
retainAll 方法会修改原列表,将原列表中的元素保留为在另一个列表中也存在的元素。注意,retainAll 会直接修改调用它的列表。
  1. 获取两个 List 的并集并去重

如果希望将两个列表合并并去除重复的元素,可以使用 HashSet,因为 HashSet 会自动去重。

示例代码:

java 复制代码
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class ListUnion {
    public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = new ArrayList<>();
        
        list1.add(1);
        list1.add(2);
        list1.add(3);
        list1.add(4);
        
        list2.add(3);
        list2.add(4);
        list2.add(5);
        list2.add(6);
        
        // 合并并去重
        Set<Integer> unionSet = new HashSet<>(list1);
        unionSet.addAll(list2);
        
        System.out.println("并集(去重): " + unionSet); // 输出 [1, 2, 3, 4, 5, 6]
    }
}

解释:

复制代码
HashSet 会自动去重,因此将两个列表的元素添加到一个 HashSet 中就能够得到去重后的并集。
  1. 获取两个 List 的差集

差集是指在一个列表中存在但在另一个列表中不存在的元素,可以使用 removeAll 方法。

示例代码:

java 复制代码
import java.util.ArrayList;
import java.util.List;

public class ListDifference {
    public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = new ArrayList<>();
        
        list1.add(1);
        list1.add(2);
        list1.add(3);
        list1.add(4);
        
        list2.add(3);
        list2.add(4);
        list2.add(5);
        list2.add(6);
        
        // 获取 list1 中不在 list2 中的元素
        list1.removeAll(list2);
        
        System.out.println("list1 - list2 的差集: " + list1); // 输出 [1, 2]
    }
}

解释:

复制代码
removeAll 方法会从 list1 中移除在 list2 中存在的元素,得到差集。
  1. 使用 Java 8 Stream API 实现

在 Java 8 及之后版本,可以使用 Stream 来操作 List,例如获取交集、并集或差集。

示例代码(Stream API 实现并集去重):

java 复制代码
import java.util.List;
import java.util.stream.Collectors;
import java.util.Arrays;

public class ListStreamUnion {
    public static void main(String[] args) {
        List<Integer> list1 = Arrays.asList(1, 2, 3, 4);
        List<Integer> list2 = Arrays.asList(3, 4, 5, 6);
        
        // 使用 Stream 进行合并并去重
        List<Integer> unionList = 
            list1.stream()
                 .distinct() // 去重
                 .collect(Collectors.toList());
        
        unionList.addAll(list2.stream().distinct().collect(Collectors.toList()));
        
        // 输出并集并去重
        System.out.println("并集(去重): " + unionList); // 输出 [1, 2, 3, 4, 5, 6]
    }
}

解释:

复制代码
stream().distinct() 去重,collect(Collectors.toList()) 收集成一个新的列表。

总结

复制代码
交集:使用 retainAll 方法。
并集并去重:可以通过 HashSet 来实现。
差集:使用 removeAll 方法。
Java 8 Stream API:通过流的方式进行并集、交集和差集的操作,简洁且函数式。

这些方法可以根据实际需求来选择,灵活地处理 List 集合的元素。

相关推荐
随读手机1 分钟前
多式联运信息交互平台完整方案(2026版)
java·ai·eclipse·云计算·区块链
郝学胜-神的一滴9 分钟前
深度学习优化核心:梯度下降与网络训练全解析
数据结构·人工智能·python·深度学习·算法·机器学习
Je1lyfish35 分钟前
CMU15-445 (2025 Fall/2026 Spring) Project#3 - QueryExecution
linux·c语言·开发语言·数据结构·数据库·c++·算法
许彰午37 分钟前
03-二叉树——从递归遍历到非递归实现
java·算法
nj01281 小时前
Spring 循环依赖详解:三级缓存、早期引用、AOP 代理与懒加载
java·spring·缓存
野生技术架构师1 小时前
2026年最全Java面试题及答案汇总(建议收藏,面试前看这篇就够了)
java·开发语言·面试
一只叫煤球的猫2 小时前
ThreadForge 源码解读一:ThreadScope 如何把并发任务放进清晰边界?
java·面试·开源
洛_尘2 小时前
Python 5:使用库
java·前端·python
程序员小假3 小时前
HTTP3 性能更好,为什么内网微服务依然多用 HTTP2?HTTP2 内网优势是什么?
java·后端
Mr数据杨3 小时前
【Codex】用教案主体模块沉淀标准化教学设计内容
java·开发语言·django·codex·项目开发