Java使用不同方式获取两个集合List的交集、补集、并集(相加)、差集(相减)

news2024/9/22 21:47:26

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测试方法
     */
    @Test
    public 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工具类
     */
    @Test
    public 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方式
     */
    @Test
    public 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接口中的方法
     */
    @Test
    public 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);
    }

输出:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/383021.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微纳制造技术——基础知识

1.什么是直接带隙半导体和间接带隙半导体 导带底和价带顶处以同一K值&#xff0c;称为直接带隙半导体 导带底和价带顶不处在同一K值&#xff0c;称为间接带隙半导体 2.扩散和漂移的公式 3.三五族半导体的性质 1.high mobility 2.wide bandgap 3.direct bandgap 4.三五族…

SWM181 串口功能使用介绍

SWM181 串口功能使用介绍&#x1f4cc;SDK固件包&#xff1a;https://www.synwit.cn/kuhanshu_amp_licheng/✨注意新手谨慎选择作为入门单片机学习。&#x1f33c;开发板如下图&#xff1a; &#x1f4cb;SWM181描述上写了有4个串口&#xff0c;在数据手册上&#xff0c;将引脚…

教你如何搭建设备-巡检管理系统,demo可分享

1、简介1.1、案例简介本文将介绍&#xff0c;如何搭建设备-巡检管理。1.2、应用场景设备管理员进行制定设备巡检时间/内容计划、记录设备巡检信息、可以查看今日待巡检设备。2、设置方法2.1、表单搭建1&#xff09;新建表单【设备档案-履历表】&#xff0c;字段设置如下&#x…

activiti7执行流程详解

什么是工作流&#xff1f; 官方定义&#xff1a;工作流是将一组任务组织起来以完成某个经营过程&#xff1a;定义了任务的触发顺序和触发条件&#xff0c;每个任务可以由一个或多个软件系统完成&#xff0c;也可以由一个或一组人完成&#xff0c;还可以由一个或多个人与软件系统…

阿赵的MaxScript学习笔记分享八《文件操作》

大家好&#xff0c;我是阿赵。继续分享MaxScript学习笔记第八篇 。这一篇主要讲文件操作&#xff0c;包括文件的I/O和导入导出。 1、获得3DsMax指定的一些目录路径 如果在电脑上安装了3DsMax软件&#xff0c;那么在文档里面会有一个3dsMax的文件夹&#xff0c;里面有一些3dsMa…

《C++ Primer Plus》(第6版)第8章编程练习

《C Primer Plus》&#xff08;第6版&#xff09;第8章编程练习《C Primer Plus》&#xff08;第6版&#xff09;第8章编程练习1. 打印字符串2. CandyBar3. 将string对象的内容转换为大写4. 设置并打印字符串5. max5()6. maxn()7. SumArray()《C Primer Plus》&#xff08;第6版…

【C++】C++11 异常

目录 1. C语言传统的处理错误的方式 2. C异常概念 3. 异常的使用 3.1. 异常的抛出和捕获 3.2. 在函数调用链中异常栈展开匹配原则 3.3. 异常的重新抛出 3.4. 异常安全 3.5. 异常规范 4.自定义异常体系 5. C标准库的异常体系 6. 异常的优缺点 6.1. C异常的优点&…

Spark性能优化二 Shuffle机制分析

&#xff08;一&#xff09; 什么情况下发生shuffle 在MapReduce框架中&#xff0c;Shuffle是连接Map和Reduce之间的桥梁&#xff0c;Map阶段通过shuffle读取数据并输出到对应的Reduce&#xff1b;而Reduce阶段负责从Map端拉取数据并进行计算。在整个shuffle过程中&#xff0c…

Linux 学习整理(使用 iftop 查看网络带宽使用情况 《端口显示》)

一、命令简介 iftop 是实时流量监控工具&#xff0c;可以用来监控网卡的实时流量&#xff08;可以指定网段&#xff09;、反向解析IP、显示端口信息等。 二、命令安装 yum install -y iftop 三、命令相关参数及说明 3.1、相关参数说明 -i&#xff1a;设定监测的网卡&#…

python未来应用前景怎么样

Python近段时间一直涨势迅猛&#xff0c;在各大编程排行榜中崭露头角&#xff0c;得益于它多功能性和简单易上手的特性&#xff0c;让它可以在很多不同的工作中发挥重大作用。 正因如此&#xff0c;目前几乎所有大中型互联网企业都在使用 Python 完成各种各样的工作&#xff0…

CAD中如何将图形对象转换为三维实体?

有些小伙伴在CAD绘制完图纸后&#xff0c;想要将图纸中的某些图形对象转换成三维实体&#xff0c;但却不知道该如何操作&#xff0c;其实很简单&#xff0c;本节CAD绘图教程就和小编一起来了解一下浩辰CAD软件中将符合条件的对象转换为三维实体的相关操作步骤吧&#xff01; 将…

HID协议详解 - Report Descriptor报告描述符构建与解析

USB相关基础知识简述 报告描述符是HID协议里比较复杂的一部分&#xff0c;在理解报告描述符之前&#xff0c;可以对USB协议数据传输的一些基础知识做一些了解&#xff0c;更方便理解后续内容。 报告是USB协议里数据传输&#xff08;Data Transfer&#xff09;的一种&#xff…

Android正确使用资源res文件

观看此文注意首先有的UI改颜色&#xff0c;没用&#xff0c;发现无法更改按钮背景颜色。我的AS下载的是最新版本&#xff0c;Button按钮的背景颜色一直都是亮紫色&#xff0c;无法更改。为什么呢&#xff1f;首先在你的清单文件中看你应用的是哪个主题。我现在用的是这个可能你…

PYthon组合数据类型的简单使用

Python的数据类型有两种&#xff0c;基本数据类型和组合数据类型&#xff0c;组合数据类型在Python的使用中特别重要。 1.组合数据类型的分类&#xff1a; 2.序列类型 序列类型中元素存在顺序关系&#xff0c;可以存在数值相同但位置不同的元素。序列类型支持成员关系操作符&…

计算机编程基础

0与1的世界 计算机是由晶体管和电路板组成的电子设备。 不论是我们微信信息的呈现、图像的储存和数字之间的运算本质上都是0和1的信息。 0、1便可以代表电压的高低、开关的闭合以及电阻的导电和不导电。 0、1表示的数字便是“逢二进一”。计算机的最小的储存单位是位&#…

Java如何String字符串带括号转成List

问题现象 今天在做一个需求&#xff1a;将存入数据库中的数据读到后解析成list遍历分析 数据格式&#xff1a; "[1677660600000, 1677660900000, 1677661200000]" "[5, 4, 4,3,2&#xff0c;0,0]" 我一开始想到的就是使用逗号分割即可 结果变成了这样的…

电容笔和Apple pencil有什么区别?开学季电容笔排行榜

与苹果的 Pencil相比&#xff0c;市面上常见的电容笔在压感上是没有具备重力压感&#xff0c;只具备着一种倾斜压感。对于绘画没有过高要求的话&#xff0c;其实一支普通的平替电容笔&#xff0c;就能为我们解决日常很多问题。它不仅可以用在办公上&#xff0c;也可以用在笔记、…

算法小抄3-理解使用Python容器之列表

引言 首先说一个概念哈,程序算法数据结构,算法是条件语句与循环语句组成的逻辑结构,而数据结构也就是容器. 算法决定数据该如何处理,而容器则决定如何数据如何存储. 不同的语言对容器有不同的实现方式, 但他们的功能都是相似的, 打好容器基础,你就可以在各式各样的语言中来回横…

1.Spring Cloud (Hoxton.SR10) 学习笔记—基础知识

本文目录如下&#xff1a;一、Spring Cloud基础知识什么是微服务架构&#xff1f;服务拆分 有哪些注意事项&#xff1f;什么是分布式集群?分布式的 CAP 原则&#xff1f;组件 - Spring Cloud 哪几个组件比较重要&#xff1f;组件 - 为什么要使用这些组件&#xff1f;组件 - Na…

有关白盒加密

白盒密码技术白皮书 有关白盒的概念 其实白盒黑盒之类概念其实是软件保护方面的概念&#xff0c;在很多方面都有应用&#xff0c;例如 黑盒&#xff1a; 传统的加密技术是默认假定处于黑盒中的&#xff0c;也就是假定攻击者无法获得密钥。具体而言&#xff0c;认为攻击者并…