Java使用不同方式获取两个集合List的交集、补集、并集(相加)、差集(相减)
1 明确概念
首先知道几个单词的意思:
并集 = union
交集 = intersection
补集 = complement
析取 = disjunction
减去 = subtract
1.1 并集
对于两个给定集合A、B,由两个集合所有元素构成的集合,叫做A和B的并集。
记作:AUB 读作“A并B”
例:{3,5}U{2,3,4,6}= {2,3,4,5,6}
1.2 交集
对于两个给定集合A、B,由属于A又属于B的所有元素构成的集合,叫做A和B的交集。
记作: A∩B 读作“A交B”
例:A={1,2,3,4,5},B={3,4,5,6,8},A∩B={3,4,5}
1.3 补集
一般地,设S是一个集合,A是S的一个子集,由S中所有不属于A的元素组成的集合,叫做子集A在S中的绝对补集。
记作:∁UA,包括三层含义:
1)A是U的一个子集,即A⊊U;
2)∁UA表示一个集合,且∁UA⊊U;
3)∁UA是由U中所有不属于A的元素组成的集合,∁UA与A没有公共元素,U中的元素分布在这两个集合中。
2 使用apache工具包
2.1 导入依赖
<!-- apache 集合工具类 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.1</version></dependency>2.2 代码如下:
public static final List<String> list1 = Arrays.asList("A", "B", "C", "D", "E", "F", null);public static final List<String> list2 = Arrays.asList("1", "2", "3", "D", "E", "F", null);/*** apache测试方法*/@Testpublic void apacheTest() {System.out.println("交集:" + CollectionUtils.intersection(list1, list2)); // 交集System.out.println("补集:" + CollectionUtils.disjunction(list1, list2)); // 补集System.out.println("并集:" + CollectionUtils.union(list1, list2)); // 并集System.out.println("list1的差集:" + CollectionUtils.subtract(list1, list2)); // list1的差集System.out.println("list2的差集:" + CollectionUtils.subtract(list2, list1)); // list2的差集}输出:

3 使用hutool工具包
3.1 导入依赖
<!-- hutool工具类 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.12</version></dependency>3.2 代码如下:
public static final List<String> list1 = Arrays.asList("A", "B", "C", "D", "E", "F", null);public static final List<String> list2 = Arrays.asList("1", "2", "3", "D", "E", "F", null);/*** hutool工具类*/@Testpublic void hutoolTest() {System.out.println("交集:" + CollectionUtil.intersection(list1, list2)); // 交集System.out.println("补集:" + CollectionUtil.disjunction(list1, list2)); // 补集System.out.println("并集:" + CollectionUtil.union(list1, list2)); //并集System.out.println("list1的差集"+CollectionUtil.subtract(list1,list2));System.out.println("list2的差集"+CollectionUtil.subtract(list2,list1));System.out.println("list1的差集:" + CollectionUtil.subtractToList(list1, list2));System.out.println("list2的差集:" + CollectionUtil.subtractToList(list2, list1));}输出:

3.3 注意
subtract()和subtractToList()作用一样,不过处理方式不同,使用subtract()时,参数不能是Arrays.asList()的结果,否则会报异常,因为Arrays.asList()返回的对象是Arrays.ArrayList,在方法实现里面调用的是AbstractList抽象类里面的removeAll()方法,该方法代码如下:
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {// ....public E remove(int index) {throw new UnsupportedOperationException();}// ....
}4 使用stream方式
4.1 代码如下:
public static final List<String> list1 = Arrays.asList("A", "B", "C", "D", "E", "F", null);public static final List<String> list2 = Arrays.asList("1", "2", "3", "D", "E", "F", null);/*** stream方式*/@Testpublic void streamTest() {List<Object> intersection = list1.stream().filter(list2::contains).collect(Collectors.toList());System.out.println("交集:" + intersection);List<String> subtract1 = list1.stream().filter(s -> !list2.contains(s)).collect(Collectors.toList());System.out.println("集合list1的差集:" + subtract1);List<String> subtract2 = list2.stream().filter(s -> !list1.contains(s)).collect(Collectors.toList());System.out.println("集合list2的差集:" + subtract2);List<String> union1 = list1.parallelStream().collect(Collectors.toList());List<String> union2 = list2.parallelStream().collect(Collectors.toList());union1.addAll(union2);List<String> union3 = union1.stream().distinct().collect(Collectors.toList());System.out.println("并集:" + union3);}
输出:

5 使用Collection接口中的方法
5.1 代码如下:
public static String[] attr1 = new String[]{"A", "B", "C", "D", "E", "F", null};public static String[] attr2 = new String[]{"1", "2", "3", "D", "E", "F", null};/*** 使用Collection接口中的方法*/@Testpublic void collectionTest() {List<String> list1 = new ArrayList<>(Arrays.asList(attr1));List<String> list2 = new ArrayList<>(Arrays.asList(attr2));list1.retainAll(list2);System.out.println("交集:" + list1);ArrayList<String> list3 = new ArrayList<>(Arrays.asList(attr1));ArrayList<String> list4 = new ArrayList<>(Arrays.asList(attr2));Set<Object> set = new HashSet<>();set.addAll(list3);set.addAll(list4);System.out.println("并集:" + set);ArrayList<String> list5 = new ArrayList<>(Arrays.asList(attr1));ArrayList<String> list6 = new ArrayList<>(Arrays.asList(attr2));list5.removeAll(list6);System.out.println("集合A的差集:" + list5);ArrayList<String> list7 = new ArrayList<>(Arrays.asList(attr1));ArrayList<String> list8 = new ArrayList<>(Arrays.asList(attr2));list8.removeAll(list7);System.out.println("集合B的差集:" + list8);}输出:

相关文章:
Java使用不同方式获取两个集合List的交集、补集、并集(相加)、差集(相减)
1 明确概念首先知道几个单词的意思:并集 union交集 intersection补集 complement析取 disjunction减去 subtract1.1 并集对于两个给定集合A、B,由两个集合所有元素构成的集合,叫做A和B的并集。记作:AUB 读作“A并B”例&#…...
【Android笔记80】Android之Retrofit适配器和文件上传下载
这篇文章,主要介绍Android之Retrofit适配器和文件上传下载。 目录 一、Retrofit适配器 1.1、Retrofit适配器 (1)引入RxJava依赖 (2)定义接口...
Nodejs模块化
1.模块化 1.1.模块化的基本概念 模块化是指解决一个复杂问题时,自顶向下逐层把系统划分为若干模块的过程。对于整个系统而言,模块是可组合、分解和更换的单元。 1.2 编程中的模块化 编程领域的模块化就是把一个大文件拆成独立并相互依赖的多个小模块…...
C++STL基础
STL基础 诞生 cpp的面向对象和泛型编程的思想本质就是提高复用性诞生了STL库 基本概念 STL标准模板库STL从广义上分为容器、算法及迭代器容器和算法之间通过迭代器进行连接STL几乎所有的代码都采用了模板类或者模板函数 基本组件 容器、算法、迭代器、仿函数、适配器、空间配置…...
数学建模经验【更新中】
数学建模简单入门 一、 分工 3人,1人论文,1人代码主力,1人论文代码(前一半时间主代码,后一半时间主论文) Tips: 不养闲人,论文必须要在对代码和题目极其了解并且能跟上队友思路的情况下才能写…...
【python学习笔记】:Excel 数据的封装函数
对比其它编程语言,我们都知道Python最大的优势是代码简单,有丰富的第三方开源库供开发者使用。伴随着近几年数据分析的热度,Python也成为最受欢迎的编程语言之一。而对于数据的读取和存储,对于普通人来讲,除了数据库之…...
如何获取或设置CANoe以太网网卡信息(GET篇)
CAPL提供了一系列函数用来操作CANoe网卡。但是,但是,首先需要明确一点,不管是获取网卡信息,还是设置网卡信息,只能访问CAPL程序所在的节点下的网卡,而不是节点所在的以太网通道下的所有网卡 关于第一张图中,Class节点下,有三个网卡:Ethernet1、VLAN 1.100、VLAN 1.200…...
“终于我从字节离职了...“一个年薪50W的测试工程师的自白...
我递上了我的辞职信,不是因为公司给的不多,也不是因为公司待我不好,但是我觉得,我每天看中我憔悴的面容,每天晚上拖着疲惫的身体躺在床上,我都不知道人生的意义,是赚钱吗?是为了更好…...
【Spring】八种常见Bean加载方式
🚩本文已收录至专栏:Spring家族学习 一.引入 (1) 概述 关于bean的加载方式,spring提供了各种各样的形式。因为spring管理bean整体上来说就是由spring维护对象的生命周期,所以bean的加载可以从大的方面划分成2种形式ÿ…...
第五回:样式色彩秀芳华
import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np第五回详细介绍matplotlib中样式和颜色的使用,绘图样式和颜色是丰富可视化图表的重要手段,因此熟练掌握本章可以让可视化图表变得更美观,突出重点和凸显艺术性。…...
关于@Test单元测试
1、关于doReturndoReturn(new Test()).when(testService).updateStatusByLock(any(), any());在单元测试里这个方法可以执行到这里之间跳过不去执行,返回你想要的返回值2、关于givengiven(user.getName(any())).willReturn("张三");在单元测试里这个方法 …...
【项目实战】WebFlux整合r2dbc-mysql实战
一、背景 Webflux虽然是响应式的,但是没办法,JDBC是基于阻塞IO实现的,所以无法真正的威力发挥不出来。 但是,Webflux一旦整合了R2DBC之后,那么它将不再受限于数据库连接了,真正打通了响应式应用的任督二脉,性能才被释放。 当然,除了Spring推出的R2DBC协议,还有Orac…...
go版本分布式锁redsync使用教程
redsync使用教程前言redsync结构Pool结构Mutex结构acquire加锁操作release解锁操作redsync包的使用前言 在编程语言中锁可以理解为一个变量,该变量在同一时刻只能有一个线程拥有,以便保护共享数据在同一时刻只有一个线程去操作。对于高可用的分布式锁应…...
大数据之Hudi数据湖_大数据治理_简介_发展历史_特性_应用场景---大数据之Hudi数据湖工作笔记0001
支持hive spark flink 美国公司开发的~ 都在使用,这些企业都在用 支持hadoop的,更新,插入,删除 和数据增量处理 支持流式数据处理. hive是离线数仓 hive不支持事物 insert overwrite 底层后来通过这种方式支持了事物 insert overwrite处理数据很低效,因为更新是基于覆盖实现…...
射频功率放大器基于纵向导波的杆状构件腐蚀诊断方法的研究
实验名称:基于纵向导波的杆状构件腐蚀诊断方法研究方向:无损探伤测试设备:信号号发生器、安泰ATA-8202功率放大器、数据采集卡、直流电源、超声探头、钢杆、前置放大器。实验过程:图:试验装置试验装置如图3.2所示。监测…...
Leedcode 二分查找 理解1
一个up的理解 一、二分查找基础例题 力扣https://leetcode.cn/problems/binary-search/ 二、二分查找模板问题 带搜索区间分为3个部分: 1、[mid],直接返回 2、[left,mid-1],设置边界right mid - 1 3、[mid1,right]&#x…...
【告别篇】大家好,再见了,我转行了,在筹备创业
前言 相信大家也一直看到我的博客没有更新过了,我其实很久没有打开过博客了,也就意味着我很长一段时间都在停滞不前,没有了学习的动力。 现在我上来是想跟大家告个别 : 很多粉丝宝宝的私信我看了,但是没有回…...
Java——岛屿数量
题目链接 leetcode在线oj题——岛屿数量 题目描述 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相…...
《代码整洁之道》笔记
1章:专业人士要有专业人士素养,要有责任心,编写代码尽可能完善没有bug,有bug也要勇于承担。坚持学习,坚持练习,保证自己的专业技能。谦虚,相互学习,与顾客达成一致2章:说…...
个人网站如何集成QQ快捷登录功能?
目录 一、网站集成QQ快捷登录的好处 二、网站接入QQ快捷登录具体步骤 (1)登录到QQ互联官网 (2)进行个人开发者认证 (3)创建网站应用 (4)填写网站资料 三、如何在本地开发环境…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
