我有2张地图:
val map1 = Map("col_1" -> "data_1", "col_2" -> "data_2", "col_3" -> "data_3")
val map2 = Map("col_1" -> "myval_1", "col_2" -> "myval_2", "col_3" -> "myval_3")
必需输出:
res = Map("col_1" -> ("data_1", "myval_1"), "col_2" -> ("data_2", "myval_2"),
"col_2" -> ("data_2", "myval_2") )
基本上保持' map1'的键。 &安培;合并两个地图的值 输出必须是元组而不是列表或序列
答案 0 :(得分:6)
使用map
(如果其他地图上缺少某个键,则抛出):
val res = map1.map { case (k, v) => (k, (v, map2(k))) }
或使用collect
(跳过两张地图中不存在的键):
val res = map1.collect { case (k, v) if map2.contains(k) => (k, (v, map2(k))) }
或map2
的默认值:
val res = map1.map { case (k, v) => (k, (v, map2.getOrElse(k, ""))) }
对于对称案例,我会使用my other answer中的Scalaz版本
答案 1 :(得分:0)
这是一个简单的解决方案,您可以在案例中使用
val resultMap = map1.map(kv => {
if(map2(kv._1) != None){
kv._1 -> (kv._2, map2(kv._1))
}
else{
kv
}
})
resultMap
应该是
Map(col_1 -> (data_1,myval_1), col_2 -> (data_2,myval_2), col_3 -> (data_3,myval_3))
如果map1
中没有map2
的密钥,则上述情况失败,对于这种情况,您可以使用匹配大小写
val resultMap = map1.map(kv => map2 getOrElse(kv._1, "noKey") match{
case "noKey" => kv
case x => kv._1 -> (kv._2, x)
})
答案 2 :(得分:0)
获取map1中存在的所有键以及map2中存在的键的组合:
val res = map1.collect { case (k, v) => if (map2.contains(k)) (k, (v, map2(k))) else (k, (v, "")) }