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