如何合并Keys上的Maps并合并其值scala

时间:2017-11-09 06:01:28

标签: scala

我有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'的键。 &安培;合并两个地图的值 输出必须是元组而不是列表或序列

3 个答案:

答案 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, "")) }