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

IT优就业 2017-09-29 16:26

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

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

假设现有社保卡和身份证若干,想要匹配筛选出一一对应的社保卡和身份证。

转换为List<社保卡> socialList,和List idList,从二者中找出匹配的社保卡。

模型

创建社保卡类:

实例|如何从两个List中筛选出相同的值_第1张图片

实例|如何从两个List中筛选出相同的值_第2张图片

创建身份证类:

实例|如何从两个List中筛选出相同的值_第3张图片

最简单的办法:遍历

只要做两轮循环即可。

准备初始化数据:

实例|如何从两个List中筛选出相同的值_第4张图片

遍历

实例|如何从两个List中筛选出相同的值_第5张图片

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

采用Hash

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

实例|如何从两个List中筛选出相同的值_第6张图片

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

Hash一定会比遍历快吗

想当然的以为,hash肯定会比遍历快,因为是hash啊。其实,可以算算比较结果。比较什么时候

2m+n < m*n

从数据归纳法的角度,n必须大于2,不然即演变程

2m+2 < 2m

于是,当n>2时:

实例|如何从两个List中筛选出相同的值_第7张图片

结果是:

m=2,n=33

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


· 2017年【中公教育】特别推出2017年就业促进计划,500万就业基金助你成为IT达人

详情请戳http://www.ujiuye.com/zt/jycj/?wt.bd=bgz

· 什么?海量IT学习资料白给你都不要?别想了,加群抢:584539956

你可能感兴趣的:(实例|如何从两个List中筛选出相同的值)