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

2021 年 6 月 22 日
 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"}...]

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

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

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

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

https://study.congcong.us/t/785118

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

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

© 2021 V2EX