集合操作交并补的三种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. 集合框架介绍 我 们知道,计算机的优势在于处理大量的数据,在编程开发中,为处理大量的数据,必须具备相应的存储结构,数组可以用来存储并处理大量类型相同的数 据,但是会发现数组在应用中的限制:数组长 ...
随机推荐
- nginx 根据 URL 参数引入不同的文件
同步发布:https://blog.jijian.link/2020-06-30/nginx-import-file/ 编程世界中各种奇奇怪怪的需求都有,本次遇到一个需求:根据URL参数判断,包含 x ...
- 在Ubuntu上安装php7.2、php7.3、php7.4
目录 开始之前 在Ubuntu 18.04或16.04上安装PHP 7.4 更新Ubuntu 添加PHP存储库 安装PHP 7.4 在Ubuntu 16.04上安装PHP 7.2 更新Ubuntu 添 ...
- MFC非模态对话框的关闭
如果要在点击按钮的情况下,销毁非模态对话框,只需要把按钮的事件映射到OnCancel函数, 里面调用DestroyWindow(), 然后重写PostNCDestroy(), delete 指针. 另 ...
- RabbitMQ 消息实现过程+事务+消息确认
服务端(生产者) 1.引用 rabbitmq 包 2.建立连接工厂 connectionfactory 3.创建 频道 createchannel 4.在频道中 绑定消息队列 5.发布basicpub ...
- 在 JavaScript 中,判断一个对象是否为空有几种方法。
使用 Object.keys() 方法检查对象的键值对数量: function isObjectEmpty(obj) { return Object.keys(obj).length === 0; } ...
- 【JVM之内存与垃圾回收篇】垃圾回收相关算法
垃圾回收相关算法 标记阶段:引用计数算法 在堆里存放着几乎所有的 Java 对象实例,在 GC 执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象.只有被标记为己经死亡的对象, ...
- Win10怀旧--win7体验
右键菜单变窄(1903以后失效) HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\FlightedFeatures Immer ...
- SMU Autumn 2024 Trial 1
A. Load Balancing 很明显题意要的就是让我们把每个数往平均值靠,这样就保证最大值-最小值最小 但是当sum%n !=0的时候就说明无法每个数都等于sum/n,所以处理的方法就是,先计算 ...
- .net WorkFlow 流程转办
WikeFlow官网:www.wikesoft.com WikeFlow学习版演示地址:workflow.wikesoft.com WikeFlow学习版源代码下载:https://gitee.com ...
- 🎀maven 版本管理
简介 Maven的versions插件提供了一系列用于处理项目版本的命令 相关命令 mvn versions:set 版本设置 mvn versions:set -DnewVersion=1.0.0- ...