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

2021-06-22 16:51:11 +08:00
 LimeQAQ

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

题目: 有 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"}...]

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

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

2563 次点击
所在节点    Java
16 条回复
Plutoler
2021-06-22 16:54:10 +08:00
双指针
sigma65535
2021-06-22 16:58:39 +08:00
遍历 listA,转换成 mapA {"a1":"","a2":"","a3":""}
遍历 listB,更新 mapA 的值
再把 mapA -> listA 的形式
vindac
2021-06-22 16:58:53 +08:00
没看懂,对于 ListA<Map>中的所有的 Map 中每个 Entry 的 key 都不一样吗
LimeQAQ
2021-06-22 17:00:09 +08:00
@vindac 每个都不一样的,互相之间没有关系
Vegetable
2021-06-22 17:00:24 +08:00
双层循环肯定不行啊,爆炸了
2 次循环加一个就行了。
先循环一个 List 建立 key:index 的对应 Map,将寻找 A 或 B 中元素的时间复杂度降到 O(1),再循环另一个 List,将结果合并,Map 里边的 key:index 可能要删掉。
你有些细节没说,具体在特殊处理就好了
Vegetable
2021-06-22 17:00:42 +08:00
*加一个 Map
bxb100
2021-06-22 17:01:36 +08:00
有序双指针, 无序 Map 映射
LimeQAQ
2021-06-22 17:01:56 +08:00
@sigma65535 用 listB 覆盖掉 mapA 中的值?人家说不是想要的答案,我问他提示一下,人家还不说。。。
vindac
2021-06-22 17:09:07 +08:00
@LimeQAQ 每个都不一样,直接 ListA 拆成一个 MapA,ListB 拆成一个 MapB,遍历 Map 就行了吧。。
sigma65535
2021-06-22 17:16:29 +08:00
@LimeQAQ 不说,还有这种奇葩,不去这公司也罢
uselessVisitor
2021-06-22 17:31:54 +08:00
相当于把 Pair 换成 Map 呗
ily433664
2021-06-22 18:02:22 +08:00
List<Map> 转为 Map<String, Map>
xylophone21
2021-06-22 18:36:25 +08:00
空间换时间转 Map,不允许换先排序
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
2021-06-23 15:28:26 +08:00
我天天写这鬼东西。虽然数据量不大。也就是和 #2 差不多的方式。
DreamSpace
2021-06-26 00:08:53 +08:00
可能是想考察 StreamAPI ?如果 listA,listB 泛型相同,用 Stream 连接起来做 reduce

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

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

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

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

© 2021 V2EX