加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在Scala的Map List中按键值对值进行求和并对它们进行分组?

发布时间:2020-12-16 18:24:22 所属栏目:安全 来源:网络整理
导读:我有一张地图清单: val list = List( Map("id" - "A","value" - 20,"name" - "a"),Map("id" - "B","value" - 10,"name" - "b"),Map("id" - "A","value" - 5,Map("id" - "C","value" - 1,"name" - "c"),Map("id" - "D","value" - 60,"name" - "d"),"value" -
我有一张地图清单:

val list = List(
  Map("id" -> "A","value" -> 20,"name" -> "a"),Map("id" -> "B","value" -> 10,"name" -> "b"),Map("id" -> "A","value" -> 5,Map("id" -> "C","value" -> 1,"name" -> "c"),Map("id" -> "D","value" -> 60,"name" -> "d"),"value" -> 3,"name" -> "c")
)

我想对值进行求和,并以最有效的方式将它们按id值分组,以便它变为:

Map(A -> 25,B -> 10,C -> 4,D -> 60)

解决方法

还使用foldLeft:

list.foldLeft(Map[String,Int]().withDefaultValue(0))((res,v) => {
  val key = v("id").toString
  res + (key -> (res(key) + v("value").asInstanceOf[Int]))
})

更新:使用reduceLeft:

(Map[String,Any]().withDefaultValue(0) :: list).reduceLeft((res,v) => {
  val key = v("id").toString
  res + (key -> (res(key).asInstanceOf[Int] + v("value").asInstanceOf[Int]))
})

顺便说一句,如果你看一下reduceLeft定义,你会看到它使用相同的foldLeft:

def reduceLeft[B >: A](f: (B,A) => B): B =
    if (isEmpty) throw new UnsupportedOperationException("empty.reduceLeft")
    else tail.foldLeft[B](head)(f)

更新2:使用par和reduce:
这里的问题是将结果Map值与初始Map值区分开来.我选择了contains(“id”).

list.par.reduce((a,b) => {
  def toResultMap(m: Map[String,Any]) =
    if (m.contains("id"))
      Map(m("id").toString -> m("value")).withDefaultValue(0)
    else m
  val aM = toResultMap(a)
  val bM = toResultMap(b)
  aM.foldLeft(bM)((res,v) =>
    res + (v._1 -> (res(v._1).asInstanceOf[Int] + v._2.asInstanceOf[Int])))
})

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读