Scala:如何将含Seq的Map转换为人名对应最大值的嵌套Map?
Scala 日期Map按人名聚合最大值的转换方法
现有Scala代码定义了Map对象d,键为日期,值是包含多个单键值对Map的Seq。需要将其转换为键仍为日期,值为以人名为键、对应日期该人名的最大值为值的Map。
输入示例
val d = Map("2020-01-30" -> Seq(Map("fff" -> 177), Map("fsdzf" -> 219), Map("fff" -> 300), Map("fff" -> 0)), "2020-01-26" -> Seq(Map("fvcfdf" -> 188), Map("vav" -> 273)))
注:原输入中的日期需用字符串包裹,否则会被Scala解析为数值运算(
2020-01-30会计算为1989),这里修正了格式问题保证代码可运行。
期望输出
Map("2020-01-30" -> Map("fff" -> 300, "fsdzf" -> 219), "2020-01-26" -> Map("fvcfdf" -> 188, "vav" -> 273))
解决方案代码
val result = d.map { case (date, seq) => date -> seq.flatMap(_.toList) .groupBy(_._1) .map { case (name, entries) => name -> entries.map(_._2).max } }
代码说明
- 扁平化处理:
seq.flatMap(_.toList)把每个单键Map转换成(人名, 数值)的元组,再将整个Seq压平,得到该日期下所有(人名,数值)的集合。 - 按人名分组:
groupBy(_._1)将元组集合按人名分组,得到每个人名下的所有数值记录。 - 取最大值:对每个分组提取数值部分,用
max方法取最大值,最终生成该日期下人名对应最大值的Map。
内容的提问来源于stack exchange,提问作者assa
相关产品推荐
相关产品推荐

