scala 两个map合并,key相同时value相加/相减都可
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)
可以看到现有的方法在key相同时,没有将value相加,而是操作符右边的值把左边的值覆盖掉了。
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)
可以看出map函数会遍历集合中的每个元素
可以为其指定返回结果:
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)))
println(mapAdd1)
其中map.getOrElse(key,default):如果map中有这个key,则返回对应的value,否在返回default
结果:
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
该函数的功能是从左往右遍历右边操作类型List,而sum对应的是对应的左边的0,该函数要求返回值类型和左边类型一致,上面的例子中返回值是Int。
同理,两个Map的代码如下:
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)
从结果中可以看出左边map对应的是map1整体,而不是遍历map1
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)))
})
println(mapAdd2)
其中map.getOrElse(key,default):如果map中有这个key,则返回对应的value,否在返回default
结果:
Map(key1 -> 1, key2 -> 7, key3 -> 11, key5 -> 10)
scala 两个map合并,key相同时value相加/相减都可的更多相关文章
- 两个map合并
两个map合并所用函数为:putAll package myProject; import java.util.HashMap; import java.util.Map; public class ...
- scala中获取Map中key和value的方法
val scores=Map("Alice"->10,"Bob"->3,"Cindy"->8) // 获取所有的key v ...
- Map的key不变,value相加
判断map中是否含有某个key,如包含则结果value相加,如不包含则新增. 直接上demo吧: package javademo; import java.util.HashMap; import ...
- scala - 从合并两个Map说开去 - foldLeft 和 foldRight 还有模式匹配
开发中遇到需求:合并两个Map集合对象(将两个对应KEY的值累加) 先说解决方案: ( map1 )) ) } 这特么什么鬼 (╯‵□′)╯""┻━┻☆))>○<) ...
- 从合并两个Map说开去 - foldLeft 和 foldRight 还有模式匹配
开发中遇到需求:合并两个Map集合对象(将两个对应Key的值累加) 先说解决方案: ( map1 /: map2 ) { )) ) } 首先: Scala中现有的合并集合操作不能满足这个需求 . 注意 ...
- python两个列表合并为字典,一个作为key,一个作为value
两个列表合并为一个字典函数list_dic(list1,list2)可以直接复制拿走 传入的参数为两个列表,list1准备作为key,list2准备作为value,key和value位置一一对应. d ...
- Java 将两个Map对象合并为一个Map对象
实现方式是通过 putAll() 方法将多个 map 对象中的数据放到另外一个全新的 map 对象中,代码如下所示,展示了两个 map 对象的合并,如果是多个 map 合并也是用这种方式. publi ...
- Clojure:将两个list合并成一个map
假设我们有两个list,分别是: (def a [“one” “two” “three”]) (def b [1 2 3]) 我们要把它们合为一个键值对应的map,做法很简单: 1. 先将a和b合为一 ...
- 获取Map的key和value的两种方法
//使用迭代器,获取key; /*Iterator<String> iter = map.keySet().iterator(); while(iter.hasNext()){ Strin ...
随机推荐
- Spring Boot 自动配置之@Conditional的使用
Spring Boot自动配置的"魔法"是如何实现的? 转自-https://sylvanassun.github.io/2018/01/08/2018-01-08-spring_ ...
- Android——spinner控件实现读取xml资源,省、市两级互动
(1)首先在res文件夹下面的values中创建一个省市arrays.xml文件夹,如下 <?xml version="1.0" encoding="utf-8&q ...
- 阿里云centos7安装mysql8数据库
一.安装mysql 1. mysql官网查找仓库源镜像,选择downloads https://www.mysql.com/downloads/ 2. 找到社区版 3. 选择yum仓库 4. 选择对应 ...
- 消息队列 ---常用的 MQ 中间件
目前市面上比较常用的 MQ(Message Queue,消息队列)中间件有 RabbitMQ.Kafka.RocketMQ,如果是轻量级的消息队列可以使用 Redis 提供的消息队列,其中 Redis ...
- redhat_快捷键和shell命令操作.md
tab键 命令自动补全 history !n 执行历史记录第n条 !! 执行上一条命令 !l 最后一条以l开头的命令 alias 创建命令的别名 alias 命令别名 = "命令行" ...
- LeetCode707 设计链表
设计链表的实现.您可以选择使用单链表或双链表.单链表中的节点应该具有两个属性:val 和 next.val 是当前节点的值,next 是指向下一个节点的指针/引用.如果要使用双向链表,则还需要一个属性 ...
- 利用css和jquery制成弹幕
1.首先上图看下效果 2.废话不多说,直接上代码 1>html代码 <div class="barrage"> <div class="scree ...
- Python_列表(list)
list()类中的提供的操作 1.索引取值 li = [11,22,33,44,55] v1 = li[3] print(li[2]) #索引取出33 print(v1) #索引取出44 print( ...
- leetcode 473. 火柴拼正方形(DFS,回溯)
题目链接 473. 火柴拼正方形 题意 给定一串数,判断这串数字能不能拼接成为正方形 思路 DFS,但是不能每次从从序列开始往下搜索,因为这样无法做到四个边覆盖不同位置的值,比如输入是(5,5,5,5 ...
- Oracle备份审计表SYS.AUD$和SYS.FGA_LOG$
ORACLE的审计表不可以使用expdp和impdp导出和导入,如果使用,会报如下错误: 需要使用exp和imp进行导出和导出 导出语句: exp " '/ as sysdba' " ...