Java 多个 List 如何取交集

2018-08-28 19:44:54 +08:00
 ElegantOfKing
业务需求,List 包含了每天的日期(例如:20180101),但是有的 List 中并不是连续的。例如
List1 包含了 20160101-20180801 的日期,
List2 包含了 20170101-20180801 的日期,
List3 包含了 20170701-20180801 的日期。
如果取交际,即可以获得 20170701-20180801

尝试了好久,实在是没有啥好的方法处理,想问问各位有什么想法吗?在此先谢过了!
5736 次点击
所在节点    问与答
14 条回复
swuzjb
2018-08-28 19:50:26 +08:00
转 set 取交集 retainAll
lambdaxs
2018-08-28 19:58:52 +08:00
两两循环,取相等,算法复杂度 n2
johnniang
2018-08-28 20:04:58 +08:00
先排序吧,然后再比较最小值取最小,比较最大值取最小,截取 List,最后转 Set
Bryan0Z
2018-08-28 20:11:04 +08:00
排序,然后三个指针遍历一次
cyhou
2018-08-28 20:11:42 +08:00
Guava: Sets.intersection(Sets.newHashSet(ListA), Sets.newHashSet(ListB))
maninfog
2018-08-28 20:40:55 +08:00
@johnniang 最小值应该是取最大吧,然后最大值取最小
fmumu
2018-08-28 23:28:06 +08:00
循环往 set 里面放,set 的 add 方法是有返回的,当 set 里面已经包含这个元素时,会返回 false
hearfish
2018-08-29 02:52:26 +08:00
本来就有序的话三个指针遍历一次就行

无序的话维护一个 HashMap<Date, Integer>,统计每个日期出现的次数,最后遍历一次只返回出现 n 次的就行
jamesxu
2018-08-29 07:13:14 +08:00
CollectionUtils.intersection
johnniang
2018-08-29 07:19:43 +08:00
@maninfog 不好意思,我的锅
inreality
2018-08-29 09:31:38 +08:00
可以说的更仔细一点吗,是日期段的交集还是日期点的交集
WisdomWang
2018-08-29 09:57:18 +08:00
用流?
wysnylc
2018-08-29 10:36:57 +08:00
三个集合转 HashMap,循环 A 同时 get B C,循环四次搞定
bumz
2018-08-29 10:40:18 +08:00
你这个业务逻辑看上去不是集合取交集,而是区间取交集

那就更简单了,找到左端点的最大值,右端点的最小值

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/484056

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX