# scala 两个map合并，key相同时value相加

## 1、先看一下map自带的合并操作的效果

```val map1 = Map("key1" -> 1, "key2" -> 3, "key3" -> 5)
val map2 = Map("key2" -> 4, "key3" -> 6, "key5" -> 10)
println(map1 + ("key1" -> 3))
println(map1 ++ map2)```

```Map(key1 -> 3, key2 -> 3, key3 -> 5)
Map(key1 -> 1, key2 -> 4, key3 -> 6, key5 -> 10)```

## 2、利用map函数

### 2.1 为了便于理解先看如下代码

```val map1 = Map("key1" -> 1, "key2" -> 3, "key3" -> 5)
map1.map { t => println(t._1, t._2) }```

```(key1,1)
(key2,3)
(key3,5)```

```println(map1.map { t => 2 })
println(map1.map { t => t._1 -> t._2 })```

```List(2, 2, 2)
Map(key1 -> 1, key2 -> 3, key3 -> 5)```

### 2.2 合并两个map

```val map1 = Map("key1" -> 1, "key2" -> 3, "key3" -> 5)
val map2 = Map("key2" -> 4, "key3" -> 6, "key5" -> 10)
val mapAdd1 = map1 ++ map2.map(t => t._1 -> (t._2 + map1.getOrElse(t._1, 0)))

`Map(key1 -> 1, key2 -> 7, key3 -> 11, key5 -> 10)`

## 3、用foldLeft

### 3.1 语法

```List(1, 2, 3, 4).foldLeft(0)((sum, i) => sum + i)
(List(1, 2, 3, 4) foldLeft 0)((sum, i) => sum + i)
(0 /: List(1, 2, 3, 4))(_ + _)  ```

```(0 /: List(1, 2, 3, 4))((sum, i) => {
println(s"sum=\${sum} i=\${i}")
sum
})```

```sum=0 i=1
sum=0 i=2
sum=0 i=3
sum=0 i=4```

```val map1 = Map("key1" -> 1, "key2" -> 3, "key3" -> 5)
val map2 = Map("key2" -> 4, "key3" -> 6, "key5" -> 10)
(map1 /: map2)((map, kv) => {
println(s"map=\${map} kv=\${kv}")
map
})```

```map=Map(key1 -> 1, key2 -> 3, key3 -> 5) kv=(key2,4)
map=Map(key1 -> 1, key2 -> 3, key3 -> 5) kv=(key3,6)
map=Map(key1 -> 1, key2 -> 3, key3 -> 5) kv=(key5,10)```

### 3.2 合并两个map：

```val map1 = Map("key1" -> 1, "key2" -> 3, "key3" -> 5)
val map2 = Map("key2" -> 4, "key3" -> 6, "key5" -> 10)
val mapAdd2 = (map1 /: map2)((map, kv) => {
map + (kv._1 -> (kv._2 + map.getOrElse(kv._1, 0)))
})

`Map(key1 -> 1, key2 -> 7, key3 -> 11, key5 -> 10)`

### 4、用模式匹配

```val mapAdd2 = map1 ++ map2.map { case (key, value) => key -> (value + map1.getOrElse(key, 0)) }
val mapAdd3 = (map1 /: map2) {
case (map, kv) => {
map + (kv._1 -> (kv._2 + map.getOrElse(kv._1, 0)))
}
}
val mapAdd4 = (map1 /: map2) {
case (map, (k, v)) => {
map + (k -> (v + map.getOrElse(k, 0)))
}
}

```Map(key1 -> 1, key2 -> 7, key3 -> 11, key5 -> 10)
Map(key1 -> 1, key2 -> 7, key3 -> 11, key5 -> 10)
Map(key1 -> 1, key2 -> 7, key3 -> 11, key5 -> 10)```

## 参考

https://www.cnblogs.com/tugeler/p/5134862.html

61 篇文章24 人订阅

0 条评论

## 相关文章

### OC学习2——C语言特性之函数

1、OC是在C语言的基础上进行扩展的，在OC中直接用C语言进行coding也是可以通过编译的。因此，函数定义的语法格式如下： 函数返回值类型 函数名（形参列表...

33570

### 泛函编程（16）－泛函状态－Functional State

初接触泛函状态觉着很不习惯。主要是在使用State数据类型时很难理解其中的原理，特别是泛函状态变迁机制（state transition mechani...

220100

### [C++]C++面试知识总结

1.程序运行知识 1.1 内存布局和分配方式 C程序的内存布局如下： ? 静态存储区：存储全局变量和static变量，通常在程序编译期间已经分配好了。 BSS...

34640

30080

37250

550100

### python类的继承与运算符重载

Officially, CPython has no rule at all for when exactly overridden method of sub...

11210

### c++返回值 注意事项

1.不要返回指向局部变量或临时对象的引用。函数执行完毕后，局部变量和临时对象会消失，引用将指向不存在的数据 2.返回指向const对象的引用  　　使用cons...

201100

12210

### c语言基础学习07_指针

=============================================================================

28800