V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LimeQAQ
V2EX  ›  Java

list<map>合并问题,面试题

  •  
  •   LimeQAQ · 2021-06-22 16:51:11 +08:00 · 2563 次点击
    这是一个创建于 1284 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天面试,问了个题没答上来。。。

    题目: 有 listA<map>例如[{"a1":""},{"a2":""},{"a3":""}...],数据量 10W 条

    和 listB<map>例如[{"a1":"aaaa"},{"a3":"ssss"},{"a4":"dddd"}...],数据量 15W 条

    listA 中 map 的 key 和 listB 中 map 的 key 有些相同,现需要把 listA 里面的和 listB 里面的 key 相同的合并,保留 listB 里面非空的 map,例如合并后为[{"a1":"aaaa"},{"a2":""},{"a3":"ssss"},{"a4":"dddd"}...]

    数据量比较大,不让用双层循环。

    这个怎么做啊。。。没思路

    16 条回复    2021-06-26 00:08:53 +08:00
    Plutoler
        1
    Plutoler  
       2021-06-22 16:54:10 +08:00
    双指针
    sigma65535
        2
    sigma65535  
       2021-06-22 16:58:39 +08:00
    遍历 listA,转换成 mapA {"a1":"","a2":"","a3":""}
    遍历 listB,更新 mapA 的值
    再把 mapA -> listA 的形式
    vindac
        3
    vindac  
       2021-06-22 16:58:53 +08:00
    没看懂,对于 ListA<Map>中的所有的 Map 中每个 Entry 的 key 都不一样吗
    LimeQAQ
        4
    LimeQAQ  
    OP
       2021-06-22 17:00:09 +08:00
    @vindac 每个都不一样的,互相之间没有关系
    Vegetable
        5
    Vegetable  
       2021-06-22 17:00:24 +08:00
    双层循环肯定不行啊,爆炸了
    2 次循环加一个就行了。
    先循环一个 List 建立 key:index 的对应 Map,将寻找 A 或 B 中元素的时间复杂度降到 O(1),再循环另一个 List,将结果合并,Map 里边的 key:index 可能要删掉。
    你有些细节没说,具体在特殊处理就好了
    Vegetable
        6
    Vegetable  
       2021-06-22 17:00:42 +08:00
    *加一个 Map
    bxb100
        7
    bxb100  
       2021-06-22 17:01:36 +08:00
    有序双指针, 无序 Map 映射
    LimeQAQ
        8
    LimeQAQ  
    OP
       2021-06-22 17:01:56 +08:00
    @sigma65535 用 listB 覆盖掉 mapA 中的值?人家说不是想要的答案,我问他提示一下,人家还不说。。。
    vindac
        9
    vindac  
       2021-06-22 17:09:07 +08:00
    @LimeQAQ 每个都不一样,直接 ListA 拆成一个 MapA,ListB 拆成一个 MapB,遍历 Map 就行了吧。。
    sigma65535
        10
    sigma65535  
       2021-06-22 17:16:29 +08:00
    @LimeQAQ 不说,还有这种奇葩,不去这公司也罢
    uselessVisitor
        11
    uselessVisitor  
       2021-06-22 17:31:54 +08:00
    相当于把 Pair 换成 Map 呗
    ily433664
        12
    ily433664  
       2021-06-22 18:02:22 +08:00
    List<Map> 转为 Map<String, Map>
    xylophone21
        13
    xylophone21  
       2021-06-22 18:36:25 +08:00
    空间换时间转 Map,不允许换先排序
    payboy
        14
    payboy  
       2021-06-23 11:16:36 +08:00
    listA.addAll(listB)
    listA.stream.filter(Objects::nonNull).collect(Collectors.toMap(k, v, (v1, v2) -> (v1 + v2))
    tedzhou1221
        15
    tedzhou1221  
       2021-06-23 15:28:26 +08:00
    我天天写这鬼东西。虽然数据量不大。也就是和 #2 差不多的方式。
    DreamSpace
        16
    DreamSpace  
       2021-06-26 00:08:53 +08:00 via Android
    可能是想考察 StreamAPI ?如果 listA,listB 泛型相同,用 Stream 连接起来做 reduce
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1214 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 18:02 · PVG 02:02 · LAX 10:02 · JFK 13:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.