Java-两个较大的List快速取交集、差集
工作中经常遇到需要取两个集合之间的交集、差集情况,但是普通的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的键设置好就可以了。
Java-两个较大的List快速取交集、差集相关推荐
- java两个很大的数相加_两个超大数的相加
两个超大数的相加,主要是判断进一的情况,另外int型有边界限制,所以转换成字符串型进行处理. /** * @description 两个超大的数字相加 * @param $numA string 第一 ...
- java两个list合并 去重_java 快速合并去重List
两个类型一样的List,合并,并且去除重复的数据 public List getPrivilegesByUserId(Long userId){ List roles=this.getRoleIdsB ...
- Java两种方式简单实现:爬取网页并且保存
注:如果代码中有冗余,错误或者不规范,欢迎指正. Java简单实现:爬取网页并且保存 对于网络,我一直处于好奇的态度.以前一直想着写个爬虫,但是一拖再拖,懒得实现,感觉这是一个很麻烦的事情,出现个小错 ...
- java实现网页保存_详解Java两种方式简单实现:爬取网页并且保存
对于网络,我一直处于好奇的态度.以前一直想着写个爬虫,但是一拖再拖,懒得实现,感觉这是一个很麻烦的事情,出现个小错误,就要调试很多时间,太浪费时间. 后来一想,既然早早给自己下了保证,就先实现它吧,从 ...
- java 两个sql文_Java和SQL取两个字符间的值
Java String str = "abcdefg"; String result = str.substring(str.indexOf(">")+1 ...
- 两个不同对象的list要取交集(list转map的应用)
前提说明 当前有两个实体类,LinePort为航线港口中间表实体,存有到港时间,出港时间,航线id和港口id,Port为港口信息表,现在前端需要将两个查询到的实体信息list,List和List通过p ...
- 高级JAVA - 利用函数式接口实现通用的取并集/交集/差集进阶版
在前文(高级JAVA - 利用函数式接口实现通用的取并集/交集/差集)中我们实现了利用函数式接口获取交集/差集 , 但是只能全部生成 , 假如我们只需要一个交集的话 , 所有代码仍然会执行一次 . 比 ...
- 高级JAVA - 利用函数式接口实现通用的取并集/交集/差集
package com.xing.dto;import com.xing.common.utils.XDataUtil; import lombok.Data;import java.util.Arr ...
- Java两大数据类型
Java两大数据类型 java中有8中基本数据类型和3中引用类型 1.8种基本类型 一).4种整型 byte 1字节 -128--127 short 2 字节 -32,768 -- 32,767 in ...
最新文章
- MLIR: Infrastructure架构
- php调用restful接口_jzq_sdk_php
- 手摸手教你使用vue-cli脚手架-详细步骤图文解析[vue入门]
- asp.Net Cookie demo
- 【原创】Linux安装Redis
- BZOJ4881 线段游戏(二分图+树状数组/动态规划+线段树)
- 一场360容器圈的武林大会“360互联网技术训练营第九期—360容器技术解密与实践” (附PPT与视频)...
- Install and Run Docker on NON ROOT
- Maven学习(四)-----Maven中央存储库
- HDU 1269 迷宫城堡 (强连通分量,常规)
- 基于源码编译安装openssh
- 2012年中国系统架构师大会 即将开幕
- 查看/统计 代码行数
- pytecplot 的安装与启动(tecplot GUI能用但是pytecplot不能用)
- 搜索中的深度匹配模型
- MV* 模式梳理与理解(还原真实的 MV* 模式)
- 软件中的易用性设计及测试(二)
- 域名和网址链接被微信浏览器拦截怎么办 微信屏蔽网址打开如何解决
- ACTF2022 rsa leak
- 技术助力“互联网+”,百度开放云成就3600行