基本概念

为了便于理解,下面首先介绍集合的三个基本操作:并集、交集和补集。

  并集:以属于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中的方法,可以实现集合的交集、并集和差集,方法如下:

  1. 交集 set1.retainAll(set2);
  2. 并集 set1.addAll(set2);
  3. 差集 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实现的更多相关文章

  1. 三种java 去掉字符串中的重复字符函数

    三种java 去掉字符串中的重复字符函数 public static void main(string[] args) { system.out.println(removerepeatedchar( ...

  2. 详解三种java实现多线程的方式

    java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  3. Django框架之ORM的相关操作之多对多三种方式(五)

    在之前的博客中已经讲述了使用ORM的多对多关系表,现在进行总结一下: 1.ORM自动帮助我们创建第三张表 2.手动创建第三张表,第三张表使用ForeignKey指向其他的两张表关联起来 3.手动创建第 ...

  4. c++ 求集合的交并补

    #include<iostream.h> #include<windows.h> #include<iomanip.h> #include<stdio.h&g ...

  5. 补五月三号java基础知识

    1.泛型技术可以通过一种类型或方法操纵各种不同类型的对象,同时又提供了编译时的类型安全保证.2.容器(即集合)是以类库形式 提供的多种数据结构,用户在编程时可直接使用3.泛型其实质就是将数据的类型参数 ...

  6. Help with Intervals(集合的交并补,线段树)

    很早以前做过这题,早就没印象了,估计当时也是照着某大神的代码抄过的,现在是连题意都看了好长时间. 刚开始的S集合是空集,给你一些操作和一个T集合,把操作的结果再赋给S集合. 解法:因为会有开区间和闭区 ...

  7. Python操作MySQL数据库的三种方法

    https://blog.csdn.net/Oscer2016/article/details/70257024 1. MySQLdb 的使用 (1) 什么是MySQLdb?   MySQLdb 是用 ...

  8. 180415_判断闰年的思路及三种 java 实现

    世纪年:能整除 100 的年份 普通年:不能整除 100 的年份 闰年:一年有 366 天,二月有 29 天 平年:一年有 365 天,二月有 28 天 对于世纪年:能整除 400 为闰年,否则为平年 ...

  9. Linux操作系统下的三种Java环境配置方法

    方法1:修改/etc/profile 文件  所有用户的 shell都有权使用这些环境变量 (1)在 shell终端执行命令:vi /etc/profile (2)在 profile文件末尾加入: e ...

  10. JAVA:三种集合LIST、SET、MAP

    1. 集合框架介绍 我 们知道,计算机的优势在于处理大量的数据,在编程开发中,为处理大量的数据,必须具备相应的存储结构,数组可以用来存储并处理大量类型相同的数 据,但是会发现数组在应用中的限制:数组长 ...

随机推荐

  1. nginx 根据 URL 参数引入不同的文件

    同步发布:https://blog.jijian.link/2020-06-30/nginx-import-file/ 编程世界中各种奇奇怪怪的需求都有,本次遇到一个需求:根据URL参数判断,包含 x ...

  2. 在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 添 ...

  3. MFC非模态对话框的关闭

    如果要在点击按钮的情况下,销毁非模态对话框,只需要把按钮的事件映射到OnCancel函数, 里面调用DestroyWindow(), 然后重写PostNCDestroy(), delete 指针. 另 ...

  4. RabbitMQ 消息实现过程+事务+消息确认

    服务端(生产者) 1.引用 rabbitmq 包 2.建立连接工厂 connectionfactory 3.创建 频道 createchannel 4.在频道中 绑定消息队列 5.发布basicpub ...

  5. 在 JavaScript 中,判断一个对象是否为空有几种方法。

    使用 Object.keys() 方法检查对象的键值对数量: function isObjectEmpty(obj) { return Object.keys(obj).length === 0; } ...

  6. 【JVM之内存与垃圾回收篇】垃圾回收相关算法

    垃圾回收相关算法 标记阶段:引用计数算法 在堆里存放着几乎所有的 Java 对象实例,在 GC 执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象.只有被标记为己经死亡的对象, ...

  7. Win10怀旧--win7体验

    右键菜单变窄(1903以后失效) HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\FlightedFeatures Immer ...

  8. SMU Autumn 2024 Trial 1

    A. Load Balancing 很明显题意要的就是让我们把每个数往平均值靠,这样就保证最大值-最小值最小 但是当sum%n !=0的时候就说明无法每个数都等于sum/n,所以处理的方法就是,先计算 ...

  9. .net WorkFlow 流程转办

    WikeFlow官网:www.wikesoft.com WikeFlow学习版演示地址:workflow.wikesoft.com WikeFlow学习版源代码下载:https://gitee.com ...

  10. 🎀maven 版本管理

    简介 Maven的versions插件提供了一系列用于处理项目版本的命令 相关命令 mvn versions:set 版本设置 mvn versions:set -DnewVersion=1.0.0- ...