【问题标题】:Scala - reducing a map based on changed keyScala - 根据更改的键减少地图
【发布时间】:2017-11-14 13:22:02
【问题描述】:

假设有以下地图数据

val testMap: Map[String, Int] = Map("AAA_abc" -> 1,
                                    "AAA_anghesh" -> 2,
                                    "BBB_wfejw" -> 3,
                                    "BBB_qgqwe" -> 4,
                                    "C_fkee" -> 5)

现在我想将映射减少key.split("_").head 并添加所有相等的键值。所以对于这个例子,Map 应该是:

Map(AAA -> 3, BBB -> 7, C -> 5)

在 Scala 中这样做的正确方法是什么? 我尝试了groupByreduceLeft 的构造,但找不到解决方案。

【问题讨论】:

  • 你能显示你试过什么代码吗?

标签: scala dictionary


【解决方案1】:

这是一种方法:

testMap.groupBy(_._1.split("_").head).mapValues(_.values.sum)

【讨论】:

  • 你可以改用mapValues(_.values.sum)
  • 我经常看到groupBy(...).mapValues(...)。我不知道为什么标准库中没有aggregateByreduceBy...@Chirlo 的分析器几乎实现了...
【解决方案2】:

一次变种:

testMap.foldLeft(Map[String,Int]())( (map, kv) => {
  val key = kv._1.split("_").head
  val previous = map.getOrElse(key,0)
  map.updated(key, previous + kv._2) })

【讨论】:

    猜你喜欢
    • 2017-06-05
    • 2015-11-30
    • 2022-01-11
    • 2021-04-08
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    相关资源
    最近更新 更多