当前位置: 首页 > 知识库问答 >
问题:

合并2个地图与键作为第二个地图的值

牟恺
2023-03-14

我有两张地图被定义Map

map1 : {
   Honda=[Accord, Civic, CRV], 
   Toyota=[Corola, RAV4, Yaris]
}
map2 : {
   Accord=[5w30, 10w40],
   Civic=[0w30, 5w30, 5w40],
   CRV=[5w30, 5w40, 10w40],
   Corola=[0w30, 10w40], 
   RAV4=[0w20, 0w30, 5w30]
}

我需要合并这两个地图,这样结果地图键将是品牌名称(如本田、丰田),值将是所有的油。有些是这样的:

mergeMap: {
   Honda=[0w30, 5w30, 5w40, 10w40],
   Toyota=[0w20, 0w30, 5w30, 10w40]
}

我编写了sam old school method,它使用forEach块,但我认为使用流等更好。可能吗?如果是,怎么做?


共有1个答案

苏高远
2023-03-14

由于生成的贴图将具有相同的键,因此可以使用mapValues

在lambda中,flatMap将值中的每个字符串设置为第二个映射中的相应值(如果存在)。

map1.mapValues { (_, v) -> v.flatMap { map2[it] ?: emptyList() }.toSortedSet() }

这给你一个地图

请注意,这将按字典顺序对“0w30”字符串进行排序,因为它们是字符串,所以你不会得到你想要的确切顺序。我不知道这些字符串代表什么,但是你可能应该用一个实现可比较数据类来表示它们。这会给你正确的顺序。

 类似资料:
  • 问题内容: 我有两个键为s且值为的映射。给定两个s,合并它们的最简单方法是什么,如果两个键相同,则值是两个集合的并集。您可以假设值永远不会为null,并且如果有用的话,我们可以将它们设为s。 问题答案: 我们在谈论实例。在这种情况下,查找值为O(1),因此您只需获取一个映射,然后对该映射的条目进行迭代,看看另一个映射是否包含该键。如果没有,只需添加设置。如果包含密钥,则将两个集合并集(通过将一个集

  • 操作步骤: ①在"图层管理"模块,选择图层,点击"更多"按钮。 ②点击"复制数据密钥"按钮。 ③弹出"复制数据密钥窗口",点击"复制"按钮。 ④进入想要合并的地图,点击地图右上工具条上的"数据密钥"按钮。 ⑤弹出"导入数据密钥窗口",粘贴刚才复制的密钥,点击"导入"按钮,数据在地图导入成功。 提示: ●复制图层数据参考复制拷贝图层 操作动图: [查看原图]

  • 在javascript中,我有两个映射map1={a:1,b:2,c:3,d:4,e:5};map2={td:a,bd:c,sd:e}; 现在我需要搜索map2的值,即(a,b,e),如果它是map1的键,然后用map1示例中的对应值更新map2的值——map2[td]=a和map[a]=1,然后我想更新map2[td]=1。谁能帮我找到一个算法吗。

  • 问题内容: 我有两张这样的地图: 我想做的就是将两个地图合并成 这样: 如果不在中,则将条目添加到中。 如果不在,则相同,将条目添加到中。 如果在中,则添加此条目: 我已经阅读了有关,但是我确实很难使用它。任何线索如何做到这一点? 谢谢!! 问题答案: 我认为这是可行的 合并功能将解决方案3,因为如果密钥已经存在,它将使用v1.mark1和v2.mark2创建一个新的MyObject。

  • 问题内容: 我想知道是否有人可以轻松地将2个深层嵌套的地图合并在一起? 例如,我想得到: 有没有一个简单的解决方案? 问题答案: 您可以编写一个使用递归的方法:

  • 我们正在使用扫描操作符来执行表中的“加载更多”按钮。使用scan操作符,我们只需将新结果与以前的结果相加。然而,我们遇到了一些意想不到的行为。 为了简化,假设我们有以下代码: 生产: 而如果我们只是将扫描操作符移动到mergeMap/switchMap操作符中: 我们得到以下结果: 在第二个示例中,未执行扫描运算符。我希望switchMap/mergeMap只是将内部的可观察对象展平,扫描操作符通