前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何从两个List中筛选出相同的值

如何从两个List中筛选出相同的值

作者头像
Ryan-Miao
发布于 2018-03-14 02:26:57
发布于 2018-03-14 02:26:57
6.5K00
代码可运行
举报
文章被收录于专栏:Ryan MiaoRyan Miao
运行总次数:0
代码可运行

问题

现有社保卡和身份证若干,想要匹配筛选出一一对应的社保卡和身份证。 转换为List<社保卡> socialList,和List idList,从二者中找出匹配的社保卡。

模型

创建社保卡类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @author Ryan Miao
 */
class SocialSecurity{
    private Integer id;//社保号码
    private Integer idCard;//身份证号码
    private String somethingElse;

    public SocialSecurity(Integer id, Integer idCard, String somethingElse) {
        this.id = id;
        this.idCard = idCard;
        this.somethingElse = somethingElse;
    }

    public Integer getId() {
        return id;
    }

    public Integer getIdCard() {
        return idCard;
    }

    public String getSomethingElse() {
        return somethingElse;
    }

    @Override
    public String toString() {
        return "SocialSecurity{" +
                "id=" + id +
                ", idCard=" + idCard +
                ", somethingElse='" + somethingElse + '\'' +
                '}';
    }
}

创建身份证类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class IdCard {
    private Integer id;//身份证号码
    private String somethingElse;

    public IdCard(Integer id, String somethingElse) {
        this.id = id;
        this.somethingElse = somethingElse;
    }

    public Integer getId() {
        return id;
    }

    public String getSomethingElse() {
        return somethingElse;
    }

    @Override
    public String toString() {
        return "IdCard{" +
                "id=" + id +
                ", somethingElse='" + somethingElse + '\'' +
                '}';
    }
}

最简单的办法:遍历

只要做两轮循环即可。 准备初始化数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private ArrayList<SocialSecurity> socialSecurities;
private ArrayList<IdCard> idCards;

@Before
public void setUp(){
    socialSecurities = Lists.newArrayList(
            new SocialSecurity(1, 12, "小明"),
            new SocialSecurity(2, 13, "小红"),
            new SocialSecurity(3, 14, "小王"),
            new SocialSecurity(4, 15, "小peng")
    );

    idCards = Lists.newArrayList(
            new IdCard(14, "xiaopeng"),
    new IdCard(13, "xiaohong"),
    new IdCard(12, "xiaoming")
    );

    //目标: 从socialSecurities中筛选出idCards中存在的卡片
}

遍历

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 @Test
public void testFilterForEach(){
    List<SocialSecurity> result = new ArrayList<>();
    int count = 0;
    for (SocialSecurity socialSecurity : socialSecurities) {
        for (IdCard idCard : idCards) {
            count++;
            if (socialSecurity.getIdCard().equals(idCard.getId())){
                result.add(socialSecurity);
            }
        }
    }

    System.out.println(result);
    System.out.println(count);//12 = 3 * 4
    //O(m,n) = m*n;
}

很容易看出,时间复杂度O(m,n)=m*n.

采用Hash

通过观察发现,两个list取相同的部分时,每次都遍历两个list。那么,可以把判断条件放入Hash中,判断hash是否存在来代替遍历查找。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
public void testFilterHash(){
    Set<Integer> ids = idCards
            .stream()
            .map(IdCard::getId)
            .collect(Collectors.toSet());
    List<SocialSecurity> result = socialSecurities
            .stream()
            .filter(e->ids.contains(e.getIdCard()))
            .collect(Collectors.toList());

    System.out.println(result);
    //初始化 hash 3
    //遍历socialSecurities 4
    //从hash中判断key是否存在  4
    //O(m,n)=2m+n=11
}

如此,假设hash算法特别好,hash的时间复杂度为O(n)=n。如此推出这种做法的时间复杂度为O(m,n)=2m+n. 当然,更重要的是这种写法更让人喜欢,天然不喜欢嵌套的判断,喜欢扁平化的风格。

Hash一定会比遍历快吗

想当然的以为,hash肯定会比遍历快,因为是hash啊。其实,可以算算比较结果。比较什么时候2m+n < m*n。 从数据归纳法的角度,n必须大于2,不然即演变程2m+2 < 2m。于是,当n>2时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
public void testCondition(){
    int maxN = 0;
    for (int m = 2; m < 100; m++) {
        for (int n = 3; n < 100; n++) {
            if ((2*m+n)>m*n){
                System.out.println("m="+m +",n="+n);
                if (n>maxN){
                    maxN = n;
                }
            }
        }
    }

    System.out.println(maxN);
}

结果是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
m=2,n=3
3

也就是说n<=3的时候,遍历要比hash快。事实上还要更快,因为hash还需要创建更多的对象。然而,大部分情况下,n也就是第二个数组的长度是大于3的。这就是为什么说hash要更好写。当然,另一个很重要的原因是lambda stream的运算符号远比嵌套循环让人喜爱。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【目标检测】YOLOv5跑通VOC2007数据集
如果经常阅读我博客的读者,想必对YOLOv5并不陌生。在Pytorch:YOLO-v5目标检测(上)一文中,我使用了coco128数据集,非常轻松的跑通了。然而在使用VOC2007数据集时,却遇到重重阻碍。主要问题在数据标签转化这个阶段,VOC数据集标注形式是xml,需要将其转换为txt。很多博文并未把文件的放置位置交代清楚,导致走了不少弯路,本篇博文就记录如何不走弯路地跑通VOC数据集。
zstar
2022/09/07
2.1K1
【目标检测】YOLOv5跑通VOC2007数据集
基于YOLOv5的玻璃瓶盖缺陷检测
​摘要:采用Yolov5对玻璃瓶盖进行缺陷检测,做到工业落地部署,该任务相对来说在工业界较为简单,性能也能够满足客户要求,做到漏判≤0.01%,误报≤0.5%,交付成功;
AI小怪兽
2023/11/30
7070
基于yolov4的目标检测_yolov5预训练模型
YOLOv5的代码是开源的,因此我们可以从github上克隆其源码。不得不说GitHub的确是全球最大的男性交友网站,里面的人个个都是人才,yolov5发布才一年左右的时间,YOLOv5就已经更新了5个分支了,分别是yolov5.1-yolov5.5分支。该项目就是利用的yolov5.5分支来作为讲解。
全栈程序员站长
2022/09/27
8260
基于yolov4的目标检测_yolov5预训练模型
基于YOLOv5的二维码QR码识别
二维码被广泛的应用在我们日常生活中,比如微信和支付宝支付、火车票、商品标识等。二维码的出现极大的方便了我们日常的生活,同时也能将信息较为隐蔽的传输。二维码种类多种多样,有QR Code、Data Matrix、Code One等,日常生活中常用的二维码是QR二维码,该二维码样式以及每部分的作用在图7-30给出。二维码定点方向有三个较大的“回”字形区域用于对二维码进行定位,该区域最大的特别之处在于任何一条经过中心的直线其在黑色和白色区域的长度比值都为1:1:3:1:1。二维码中间具有多个较小的“回”字形区域用于二维码的对齐,根据二维码版本和尺寸的不同,对齐区域的数目也不尽相同。
AI小怪兽
2023/12/04
1K0
利用yolov5实现口罩佩戴检测算法
首先申明,这篇博客是用于记录我第一次完全从头到尾跑通一个算法,我会在此博客详细写出我的具体过程,以供大家参考,可能会和炮哥博客有些重合,没办法毕竟我就是用他的博客来训练模型的。但这篇博客我会结合炮哥的博客和我自己训练过程中的一些问题和心得来写,所以还是会有所不的!!!博主其实也是个深度学习的小菜鸟hhh。在此感谢。
润森
2022/09/22
8350
利用yolov5实现口罩佩戴检测算法
Pytorch:YOLO-v5目标检测(上)
YOLO全称为You Only Look Once(你只需看一次)。卷积神经网络处理图像时,需要将用卷积核对图像进行逐行扫描,而YOLO则是将一张图片分成无数个方格,通过机器来判断每个方格出现目标的可能性。具体的理论比较复杂,想要了解原理,我推荐看下面两个视频。 第一个是吴恩达讲解的Yolo算法(传送门) 第二个是B站讲解最清楚的Yolo-v3算法(传送门) Yolo中的v即version,代表版本,yolo的创始人总共从v1更新到v3,而v4,v5则是另外一位作者编写,虽未得到官方认可,但在某测试集上的表现已经超越之前的v3版本。
zstar
2022/06/14
1.3K0
Pytorch:YOLO-v5目标检测(上)
【yolov5目标检测】使用yolov5训练自己的训练集
首先得准备好数据集,你的数据集至少包含images和labels,严格来说你的images应该包含训练集train、验证集val和测试集test,不过为了简单说明使用步骤,其中test可以不要,val和train可以用同一个,因此我这里只用了一个images
叶茂林
2023/10/23
1.3K0
【yolov5目标检测】使用yolov5训练自己的训练集
使用YOLOv5模型进行目标检测!
目标检测是计算机视觉领域的一大任务,大致分为一阶段目标检测与两阶段目标检测。其中一阶段目标检测模型以YOLO系列为代表。最新的YOLOv5在各个数据集上体现出收敛速度快、模型可定制性强的特点,值得关注。本文主要讲解如何从零训练自己的YOLOv5模型与一些重要参数的含义。
Datawhale
2021/07/12
11.2K0
使用YOLOv5模型进行目标检测!
基于YOLOv8的遥感SAR舰船小目标识别
本文摘要:基于YOLOv8的遥感SAR舰船小目标,阐述了整个数据制作和训练可视化过程
AI小怪兽
2024/01/12
1.4K2
GitHub YOLOv5 开源代码项目系列讲解(四)------训练相关参数解释
可以用于指定一个训练好的模型路径,用这个模型初始化模型中一些参数(首先需要提前下载或运行程序时会自动下载)
荣仔_最靓的仔
2022/01/05
3K1
GitHub YOLOv5 开源代码项目系列讲解(四)------训练相关参数解释
基于Yolov8网络进行目标检测(二)-安装和自定义数据集
首先我们要知道YOLOv8这次发行中带的预训练模型,是是基于COCO val2017 数据集训练的结果。
python与大数据分析
2023/09/18
2.4K0
基于Yolov8网络进行目标检测(二)-安装和自定义数据集
YOLOv9如何训练自己的数据集(NEU-DET为案列)
💡💡💡 2024年计算机视觉顶会创新点适用于Yolov5、Yolov7、Yolov8等各个Yolo系列,专栏文章提供每一步步骤和源码,轻松带你上手魔改网络 !!!
AI小怪兽
2024/03/26
1K0
基于YOLOv8的摄像头下铁路工人安全作业检测(工人、反光背心和安全帽)系统
💡💡💡本文摘要:基于YOLOv8的铁路工人安全作业检测系统,属于小目标检测范畴,并阐述了整个数据制作和训练可视化过程​
AI小怪兽
2024/04/15
8030
用YOLOv5模型识别出表情!
本文整体思路如下。提示:本文含完整实践代码,代码较长,建议先看文字部分的实践思路,代码先马后看
Datawhale
2021/09/22
1.2K0
基于YOLOv5的摄像头吸烟行为检测系统(pytoch)
AI工具如何改变生活,本文主要通过YOLOv5技术阐述生活中对摄像头进行监控,并对吸烟危险行为进行识别,详细阐述了如何提升吸烟行为的检测精度。
AI小怪兽
2023/11/30
1.1K0
全球人工智能技术创新大赛【热身赛一】布匹疵点智能识别Baseline
在布匹的实际生产过程中,由于各方面因素的影响,会产生污渍、破洞、毛粒等瑕疵,为保证产品质量,需要对布匹进行瑕疵检测。布匹疵点检验是纺织行业生产和质量管理的重要环节,目前人工检测易受主观因素影响,缺乏一致性;并且检测人员在强光下长时间工作对视力影响极大。由于布匹疵点种类繁多、形态变化多样、观察识别难道大,导致布匹疵点智能检测是困扰行业多年的技术瓶颈。
听城
2021/03/02
1.4K0
全球人工智能技术创新大赛【热身赛一】布匹疵点智能识别Baseline
深度好文 | YOLOv5+DeepSORT多目标跟踪深入解读与测试(含源码)
本文主要介绍如何使用Yolo-V5 + DeepSORT实现多目标检测与跟踪。(公众号:OpenCV与AI深度学习)
Color Space
2022/09/26
12.4K0
Yolo实用指南(step by step)之四yolov5预测数据
1、第一次经历,参考Yolo实用指南(step by step)之三yolov5训练自己的数据集
python与大数据分析
2023/03/02
9140
Yolo实用指南(step by step)之四yolov5预测数据
【目标检测】YOLOv5跑通VOC2007数据集(修复版)
在【目标检测】YOLOv5跑通VOC2007数据集一文中,我写了个脚本来提取VOC中Segmentation划分好的数据集,但是经过观察发现,这个train.txt中仅有209条数据,而VOC2007的图片有9963张,这意味着大量的图片被浪费,没有输入到模型中进行训练。
zstar
2022/09/16
5890
【目标检测】YOLOv5跑通VOC2007数据集(修复版)
基于YOLOv8的摄像头吸烟行为检测系统(Python源码+Pyqt6界面+数据集)
💡💡💡本文主要内容:详细介绍了摄像头下吸烟行为检测系统,在介绍算法原理的同时,给出Pytorch的源码、训练数据集以及PyQt6的UI界面。在界面中可以选择各种图片、视频进行检测识别,可进行置信度、Iou阈值设定,结果可视化等。
AI小怪兽
2024/01/29
1.5K5
推荐阅读
相关推荐
【目标检测】YOLOv5跑通VOC2007数据集
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验