集合操作交并补的三种Java实现
基本概念
为了便于理解,下面首先介绍集合的三个基本操作:并集、交集和补集。
并集:以属于A或属于B的元素为元素的集合称为A与B的并(集),记作A∪B(或B∪A),读作“A并B”(或“B并A”),即A∪B={x|x∈A,或x∈B}。

交集: 以属于A且属于B的元素为元素的集合称为A与B的交(集),记作A∩B(或B∩A),读作“A交B”(或“B交A”),即A∩B={x|x∈A,且x∈B}。

在集合论和数学的其他分支中,存在补集的两种定义:相对补集和绝对补集。
绝对补集:属于全集U不属于集合A的元素组成的集合称为集合A的补集,记作CuA,即CuA={x|x∈U,且x不属于A}。补集一般指绝对补集。

相对补集(差集):若A 和B 是集合,则A 在B 中的相对补集是这样一个集合:其元素属于B但不属于A,B -A = { x| x∈B且x∉A}。

举例:令集合A={1,2,3,4,5},集合B={1,2,3,10},则差集:B-A={10}。
在介绍集合实现方法之前,先介绍一下本文要用到的包:
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
本文基于Java 8进行测试,采用的Guava版本为
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>29.0-jre</version>
</dependency>
Jdk中的操作
定义两个Integer类型的非空集合set1和set2,则在使用JDK中的方法,可以实现集合的交集、并集和差集,方法如下:
- 交集 set1.retainAll(set2);
- 并集 set1.addAll(set2);
- 差集 or 补集 set1.removeAll(set2)。
温馨提示,它们都是把结果集记录在set1中,使用的时候需要留意。
Guava Sets操作
@Test
public void setOperation() {
Set<Integer> set1 = Sets.newHashSet(1, 2, 3, 4, 5);
Set<Integer> set2 = Sets.newHashSet(3, 4, 5, 6, 7, 9);
Sets.SetView<Integer> intersection = Sets.intersection(set1, set2);
LOGGER.info("交集为:{}", intersection.toString());//[3, 4, 5]
Sets.SetView<Integer> union = Sets.union(set1, set2);
LOGGER.info("并集为:{}", union.toString());//[1, 2, 3, 4, 5, 6, 7, 9]
Sets.SetView<Integer> diff = Sets.difference(set1, set2);
LOGGER.info("差集为:{}", diff.toString());//[1, 2]
set1.retainAll(set2);
LOGGER.info("jdk中求交集:{}", set1);
}
Apache CollectionUtils
org.apache.commons.collections4.CollectionUtils同样实现了集合的交集、并集和差集,方法如下:
@Test
public void CollectionUtilsOperation() {
Set<Integer> set1 = Sets.newHashSet(1, 2, 3, 4, 5);
Set<Integer> set2 = Sets.newHashSet(3, 4, 5, 6, 7, 9);
Collection<Integer> col = CollectionUtils.retainAll(set1, set2);
LOGGER.info("交集为:{}", col.toString());
col = CollectionUtils.union(set1, set2);
LOGGER.info("并集为:{}", col.toString());
col = CollectionUtils.subtract(set1, set2);
LOGGER.info("补集为:{}", col.toString());
}
List 取交集
使用jdk自带的轮子retainAll求两个List的交集,demo:
public static void main(String[] args) {
List<String> sourceList = new ArrayList<>();
List<String> candidateList = new ArrayList<>();
sourceList.add("10");
sourceList.add("2");
sourceList.add("3");
sourceList.add("7");
candidateList.add("10");
candidateList.add("3");
candidateList.add("32");
sourceList.retainAll(candidateList);
System.out.println("两个List的交集:");
for(String s : sourceList){
System.out.println(s);
}
}
这是List自带的retain取交集的方法,执行后控制台打印结果如下:
两个List的交集:
10
3
Reference
https://zhidao.baidu.com/question/116778634.html
集合操作交并补的三种Java实现的更多相关文章
- 三种java 去掉字符串中的重复字符函数
三种java 去掉字符串中的重复字符函数 public static void main(string[] args) { system.out.println(removerepeatedchar( ...
- 详解三种java实现多线程的方式
java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- Django框架之ORM的相关操作之多对多三种方式(五)
在之前的博客中已经讲述了使用ORM的多对多关系表,现在进行总结一下: 1.ORM自动帮助我们创建第三张表 2.手动创建第三张表,第三张表使用ForeignKey指向其他的两张表关联起来 3.手动创建第 ...
- c++ 求集合的交并补
#include<iostream.h> #include<windows.h> #include<iomanip.h> #include<stdio.h&g ...
- 补五月三号java基础知识
1.泛型技术可以通过一种类型或方法操纵各种不同类型的对象,同时又提供了编译时的类型安全保证.2.容器(即集合)是以类库形式 提供的多种数据结构,用户在编程时可直接使用3.泛型其实质就是将数据的类型参数 ...
- Help with Intervals(集合的交并补,线段树)
很早以前做过这题,早就没印象了,估计当时也是照着某大神的代码抄过的,现在是连题意都看了好长时间. 刚开始的S集合是空集,给你一些操作和一个T集合,把操作的结果再赋给S集合. 解法:因为会有开区间和闭区 ...
- Python操作MySQL数据库的三种方法
https://blog.csdn.net/Oscer2016/article/details/70257024 1. MySQLdb 的使用 (1) 什么是MySQLdb? MySQLdb 是用 ...
- 180415_判断闰年的思路及三种 java 实现
世纪年:能整除 100 的年份 普通年:不能整除 100 的年份 闰年:一年有 366 天,二月有 29 天 平年:一年有 365 天,二月有 28 天 对于世纪年:能整除 400 为闰年,否则为平年 ...
- Linux操作系统下的三种Java环境配置方法
方法1:修改/etc/profile 文件 所有用户的 shell都有权使用这些环境变量 (1)在 shell终端执行命令:vi /etc/profile (2)在 profile文件末尾加入: e ...
- JAVA:三种集合LIST、SET、MAP
1. 集合框架介绍 我 们知道,计算机的优势在于处理大量的数据,在编程开发中,为处理大量的数据,必须具备相应的存储结构,数组可以用来存储并处理大量类型相同的数 据,但是会发现数组在应用中的限制:数组长 ...
随机推荐
- FastAPI 路径参数完全指南:从基础到高级校验实战 🚀
title: FastAPI 路径参数完全指南:从基础到高级校验实战 date: 2025/3/5 updated: 2025/3/5 author: cmdragon excerpt: 探讨 Fas ...
- Navicat 数据库如何再次打开恢复上次的页面
选项->选项卡->从上次离开的画面继续 2.其他软件有这个需求也可以在设置里找一找!
- Web前端入门第3问:前端需要学习哪些技术?
Web前端开发技术学习路径 基础知识 必备 HTML+CSS+JavaScript ,就目前来看,这三板斧是入门前端开发的门槛,无论如何都是逃不掉了. 进阶知识 必须会一门主流的前端框架,比如:Rea ...
- mysql-8.0.19-winx64.zip 的安装与卸载
一.安装 1.下载mysql 官网:https://dev.mysql.com/downloads/mysql/,本人用的目前的最新版本8.0.19,版本格式为zip,如下图 2.解压到指定路径,如下 ...
- 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
引言 最近遇到了一个 ActiveMQ 消费端的问题:在没有消息时,日志频繁打印,每秒打印2000多条空消息,导致日志文件迅速膨胀,甚至影响系统性能.经过一番排查,最终定位到问题根源并成功解决.本文将 ...
- ubuntu 22.04安装NFS
一.概述 1. 定义 NFS(Network File System)是一种分布式文件系统协议,最初由 Sun Microsystems 开发,并于1984年发布.它允许不同主机通过网络共享文件和目录 ...
- 使用 AutoGen Studio 打造你的私有团队
AI Agent 无疑是今年最火爆的概念,从科技巨头的战略布局到创业公司的创新产品,AI 智能体正在重塑我们与机器交互的方式.无论是自动化任务.个性化服务,还是复杂问题的协同解决,AI Agent 都 ...
- 康谋分享 | aiSim5激光雷达LiDAR模型验证方法(二)
aiSim中的LiDAR是一种基于光线追踪的传感器,能够模拟真实LiDAR发射的激光束,将会生成LAS v1.4标准格式的3D点云,包含了方位角.俯仰角和距离等. aiSim能够模拟LiDAR单态(M ...
- 极客时间上新 .NET + AI 体系课
课程特色 1️⃣ 全网首个.NET+AI体系化课程(没有之一!) 2️⃣ Semantic Kernel + Kernel Memory 核心知识全覆盖 3️⃣ 每课时基于Polyglot Noteb ...
- 使用 AOT 编译保护 .NET 核心逻辑,同时支持第三方扩展
引言 在开发大型ERP .NET 应用程序时,我面临一个挑战:如何创建一个可供第三方引用的组件(DLL)以便二次开发,但同时保护核心逻辑不被轻易反编译,还要支持反射机制(包括私有字段访问),并且坚持使 ...