V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ElegantOfKing
V2EX  ›  问与答

Java 多个 List 如何取交集

  •  
  •   ElegantOfKing · 2018-08-28 19:44:54 +08:00 · 5902 次点击
    这是一个创建于 2297 天前的主题,其中的信息可能已经有所发展或是发生改变。
    业务需求,List 包含了每天的日期(例如:20180101),但是有的 List 中并不是连续的。例如
    List1 包含了 20160101-20180801 的日期,
    List2 包含了 20170101-20180801 的日期,
    List3 包含了 20170701-20180801 的日期。
    如果取交际,即可以获得 20170701-20180801

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

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

    那就更简单了,找到左端点的最大值,右端点的最小值
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3106 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:56 · PVG 12:56 · LAX 20:56 · JFK 23:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.