Java-两个较大的List快速取交集、差集

2023-05-16

工作中经常遇到需要取两个集合之间的交集、差集情况,但是普通的retainAll()和removeAll()无法满足数据量大的情况,由此就自己尝试运用其他的方法解决。注:如果数据量小的情况下,还是使用retainAll()和removeAll()方便

1.假使不存在重复数据,如果存在重复数据,也会被覆盖掉,实际情况中,重复数据也无意义。
2.取交集或者差集时存在主数据和从数据的关系,可提前判断一下那个集合数据量更多,来决定主从数据,或者经过两轮比较,或者经过两轮比较,获取两个结果集。下面例举中,list1为主数据,list2为从数据。

取交集

public static void main(String[] args) {
        //模拟数据
        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = new ArrayList<>();
        for (int i = 1; i <= 1000000; i++) {
            list1.add(i);
            list2.add(1000000 - i);
        }
        //记录开始时间
        long startTime = System.currentTimeMillis();
        //最后结果集
        List<Integer> resultList = new ArrayList<>();
        //中间存储
        Map<String, Integer> map = new HashMap<>();

        list2.forEach(i2 -> {
            map.put(i2 + "", i2);
        });

        list1.forEach(i1 -> {
            Integer m = map.get(i1 + "");
            //如果不为空,则证明list1和list2都拥有该数据
            if (m != null) {
                resultList.add(i1);
            }
        });
        System.out.println("耗时:" + (System.currentTimeMillis() - startTime) + "ms");
        System.out.println(resultList.size());
    }

运行结果
在这里插入图片描述

取差集

 public static void main(String[] args) {
        //模拟数据
        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = new ArrayList<>();
        for (int i = 1; i <= 1000000; i++) {
            list1.add(i);
            list2.add(1500000 - i);
        }
        //记录开始时间
        long startTime = System.currentTimeMillis();
        //最后结果集
        List<Integer> resultList = new ArrayList<>();
        //中间存储
        Map<String, Integer> map = new HashMap<>();

        list2.forEach(i2 -> {
            map.put(i2 + "", i2);
        });

        list1.forEach(i1 -> {
            Integer m = map.get(i1 + "");
            //如果为空,则证明list2中无该数据
            if (m == null) {
                resultList.add(i1);
            }
        });
        System.out.println("耗时:" + (System.currentTimeMillis() - startTime) + "ms");
        System.out.println(resultList.size());
    }

运行结果
在这里插入图片描述

总结

在双向一百万的数据情况下,使用retainAll()和removeAll()取交集和差集,都需要很长的时间,但是使用map来存储数据,后续通过循环来对比数据,速度就会有显著提升,此方法可以使用于任意数据结构,只要把中间map的键设置好就可以了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java-两个较大的List快速取交集、差集 的相关文章

  • Navicat Linux无限试用

    安装 本人用的Arch xff0c 一句话 xff08 邪教大法 xff09 yaourt navicat121 premium 找过好几个注册码发现都不能用 xff0c 注册码生成器都是Windows平台的 xff0c Linux下没办法
  • Android AIDL进程间通信的简单使用

    Android AIDL进程间通信的简单使用 https github com xueqiya AIDL git
  • 算法分析:求最近点对问题(c++)

    算法分析 求最近点对问题 c 1 准备部分 对于最近点问题 需要将问题代码化 所以要先创建一个点类 来使得计算使用时候更加方面 class Points span class token comment 点类 span span class
  • chromium for android 源码编译

    官方文档 https chromium googlesource com chromium src 43 master docs android build instructions md 准备 Ubuntu xff08 其他linux也可
  • ChromeTabbedActivity启动初始化

    ChromeLauncherActivity 启动ChromeTabbedActivity ChromeTabbedActivity ChromeTabbedActivity extends ChromeActivity ChromeAct
  • linux http代理

    linux设置代理 1 编辑profile文件 vi etc profile 2 添加代理 有用户名和密码 xff1a export http proxy 61 http 用户名 密码 64 ip 端口号 export https prox
  • Flutter urlencode转换

    Uri encodeComponent url To encode url Uri decodeComponent encodedUrl To decode url
  • Flutter 中的key、LocalKey、GlobalKey等等

    key之间的关系 key 64 immutable abstract class Key const factory Key String value 61 ValueKey lt String gt 64 protected const
  • 小鹤双拼皮肤

    手机输入法皮肤
  • Arch 安装 deb

    安装 debtap yaourt S debtap 也应该安装bash xff0c binutils xff0c pkgfile 和 fakeroot 依赖包 创建 更新 pkgfile 和 debtap 数据库 sudo debtap u
  • interp2

    原 Matlab 图像插值函数interp2理解 2016年05月10日 23 47 35 Ian ma 阅读数 xff1a 13363 lt div gt lt div class 61 34 operating 34 gt lt div
  • 远程登录windows桌面蓝屏的解决方法

    1 windows 43 r xff0c 打开运行 xff0c 输入mstsc xff0c 回车 xff0c 输入对应的服务器登录 2 登陆后出现蓝屏 xff0c 无法显示桌面 xff0c Ctrl 43 Alt 43 End键 xff0c
  • ALM/QC11.0在win8/IE11下无法浏览

    页面显示要求安装插件 xff0c 安装ALM Platform Loader 11 msi 失败 xff0c 提示 cannot be installed on windows xp vista windows7 x64 UAC已关闭 xf
  • opengl实现俄罗斯方块

    include 34 Angel h 34 pragma comment lib 34 glew32 lib 34 include lt cstdlib gt include lt iostream gt include lt time h
  • Mysql学习日记:L20-insert(DML)

    目录 一 insert语法格式 二 insert插入日期 2 1 str to date函数 2 2 date format函数 2 3 date和datetime的区别 三 insert一次插入多条语句 一 insert语法格式 语法格式
  • 解决debian服务器中文显示乱码问题

    由于安装debian选择语言时选择了简体中文安装 xff0c 但内核没有中文字库 xff0c 导致某些字符显示为乱码 xff08 菱形 xff0c 方块 xff09 解决办法 xff1a 普通用户如果没有设置sudo权限 xff0c 首先切
  • 201609-3炉石传说——CCF试题2016年9月第三题

    问题描述 炉石传说 xff1a 魔兽英雄传 xff08 Hearthstone Heroes of Warcraft xff0c 简称炉石传说 xff09 是暴雪娱乐开发的一款集换式卡牌游戏 xff08 如下图所示 xff09 游戏在一个战
  • C语言打印宏定义/枚举变量 名称和变量值

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • File size exceeds....(文件大小超过限制处理)

    File size exceeds configured limit 2560000 Code insight features not available 原因 xff1a IDEA对能关联的文件大小做了限制 xff0c 主要是为了保护内
  • 第一章-介绍

    介绍 一般建议 什么是游戏引擎 什么是Godot 下载Godot 其他安装方法 Godot UI概述 Project Manager 选择文件名 编辑器窗口 关于节点和场景 Godot中的脚本 关于GDScript 总结 无论你是想要从事的

随机推荐

  • 安装ubuntu系统,报错WslRegisterDistribution failed with error: 0x8007019e

    在windows应用商店安装ubuntu系统 xff0c 报错WslRegisterDistribution failed with error 0x8007019e 1 报错 xff1a Installing this may take
  • 安装Anaconda后,发现文件缺少大量文件

    电脑崩溃修复后 xff0c 使用的Anaconda 居然也崩了 xff0c 重新安装后丢失很多文件 xff0c 然后就是重复的卸载 安装 卸载 xff0c 还是不行 xff0c 我的心态也快要崩了 xff0c 哎 xff0c 就下面图示一样
  • AutoMapping 9 使用入门

    AutoMapping 9语法更改 using AutoMapper using System using System Collections Generic using System Linq using System Text usi
  • Oracle在线练习

    oracle官方的服务 Live SQL xff0c 挺方便的 需要注册一个帐号 访问地址 xff1a https livesql oracle com apex livesql file index html https livesql
  • pyinstaller 打包取消命令行窗口弹出

    pyinstaller F w icon 61 photo ico test py w可以使得exe运行时不弹窗
  • c#有参构造函数中怎么调用其无参构造函数

    class A public A public A int A this 当A a 61 new A 1 时 会先调用无参数的构造函数 在调用有参数那个
  • 使用npm的一些问题

    npm切换为国内的数据源 npm config set registry https span class token punctuation span span class token operator span span class t
  • Caliburn.Micro将枚举 绑定到ComboBox

    参考 https stackoverflow com questions 47480725 caliburn micro enum binding in combobox 上面的文章详细地说明了CM的绑定原理和操作步骤 xff0c 但我需要
  • WPF DataGrid 获取多选项目

    解决方案 xff1a 先附上地址 xff1a https stackoverflow com questions 9880589 bind to selecteditems from datagrid or listbox in mvvm
  • 记一次netcore 3.1 发布失败

    VS版本 xff1a 2019 16 8 5 使用框架 xff1a netcore3 1 问题描述 xff1a 项目可以正常生成 xff0c 但部署模式为独立时 xff0c 不能发布 xff0c 部署模式为依赖框架 xff0c 可以发布 报
  • 在.NET中使用COM组件

    在 NET中使用COM组件 文章目录 在 NET中使用COM组件早期绑定COM对象为COM类型库生成互操作程序集使用COM组件 后期绑定COM对象通过与非托管代码互操作创建COM对象通过平台调用创建COM对象通过C 43 43 Intero
  • Go语言生成dll

    GO语言生成dll 环境dll代码编译调试 环境 操作系统 xff1a win7 64位 go版本 xff1a 1 17 gcc版本 xff1a Thread model win32 gcc version 8 1 0 x86 64 win
  • 腾讯云轻量应用服务器配置https踩坑

    服务器里有许多应用模板 xff0c 这些应用装上应可以运行 xff0c 非常方便 xff0c 但配置https踩了许多坑 xff0c 记录一下吧 以WordPress 腾讯云插件版为例 xff0c 应用信息如下 SSL证书安装 点击Ngin
  • 微信支付宝扫码支付简介

    微信平台 支付模式 付款码支付Native支付JSAPI支付APP支付H5支付小程序支付 各种模式的定义可以查看微信官方文档 这里应用Native支付 xff0c 它是商户系统按微信支付协议生成支付二维码 xff0c 用户再用微信 扫一扫
  • C++十六进制转十进制

    方法一 span class token macro property span class token directive hash span span class token directive keyword include span
  • Apache2 配置 HTTPS

    文章目录 自签名 CA 证书服务器部署 HTTPS客户端验证Https 原理 常见问题参考 自签名 CA 证书 生成密钥 使用 128 位的 RSA 算法生成的密钥 xff0c 4096 是密钥的长度 xff0c 建议使用 4096 或以上
  • WPF .Net5 caliburnmicro初始化

    貌似nuget没有提供 Net5的Starter模版 xff0c 因此记录一下初始化工程的流程 下载Cal Nuget 搜索Caliburn 下载4 0 173版本 向工程添加ViewModels和Views文件夹 添加ViewModel
  • MSF手机渗透实验(未成功)(CVE-2019-2215 Binder UA)

    1 前言 最近想利用metasploit对手机进行依次渗透实验 通过查看最近三年的安卓漏洞 xff0c 我对CVE 2019 2215这个漏洞很感兴趣 幸运的是 xff0c metasploit里就有这个漏洞的攻击payload xff0c
  • Socket缓冲区大小修改与系统设置

    每个Socket在Linux中都映射为一个文件 xff0c 并与内核中两个缓冲区 xff08 读缓冲区 写缓冲区 xff09 相关联 或者说 xff0c 每个Socket拥有两个内核缓冲区 有时 xff0c 我们需要修改缓冲区的内核限制的最
  • Java-两个较大的List快速取交集、差集

    工作中经常遇到需要取两个集合之间的交集 差集情况 xff0c 但是普通的retainAll 和removeAll 无法满足数据量大的情况 xff0c 由此就自己尝试运用其他的方法解决 注 xff1a 如果数据量小的情况下 xff0c 还是使