在scala中将键值对添加到Map

Posted

技术标签:

【中文标题】在scala中将键值对添加到Map【英文标题】:Adding key-value pairs to Map in scala 【发布时间】:2016-10-06 03:28:56 【问题描述】:

我是 scala 的新手,想创建一个哈希映射,键是候选人,值是票数。像这样:(1:20),(2:4),(3:42),..。

我已尝试使用以下代码:

 val voteTypeList = textFile.map(x=>x(2)) //String array containing votes: [3,4,2,3,2,1,1,1,9,..]

 var voteCount:Map[String,Int] = Map()

 voteTypeList.foreachx=>

     if (voteCount.contains(x)) //Increment value
       var i: Integer = voteCount(x)
       voteCount.updated(x, i+1)
      // print(voteCount(x))
     
     else //Create new key-value pair
     //  println(x)
       voteCount += (x -> 1) 

   

 print(voteCount.size)

但没有创建 voteCount 并且 .size 返回 0。

谢谢!

【问题讨论】:

【参考方案1】:

您遇到的问题是由使用var 来保存不可变的Map 引起的。将其更改为持有可变Mapval 即可。

val voteCount:collection.mutable.Map[String,Int] = collection.mutable.Map()

话虽如此,代码还存在许多其他问题,使其不符合 Scala 的做事方式。

你真正想要的是更接近这个的东西。

val voteCount = voteTypeList.groupBy(identity).mapValues(_.length)

【讨论】:

谢谢,我现在意识到在处理大数据时 foreach 很糟糕。经过更多的谷歌搜索后,我来到了这些简单的线条,这很有效! :) val voteTypeList = textFile.map(x=>(x(2),1)) val voteCount = voteTypeList reduceByKey((a,b) => a+b) 很高兴您提出了一个可行的解决方案,但foreach 不是“在处理大数据时很糟糕”。它很少使用,因为它没有返回值(实际上返回 Unit)而是通过副作用起作用。【参考方案2】:

Jwvh 的回答是惯用的,但不是很明显,如果列表有大量重复项,那么会占用大量内存。

您也可以考虑以字面意思(但仍然是标量)的方式进行此操作:

 val voteCount = voteTypeList.foldLeft(Map(): Map[Int, Int])  (v, x) =>
    v + (x -> (v.getOrElse(x, 0) + 1))
  

【讨论】:

以上是关于在scala中将键值对添加到Map的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 for 循环中将键值对添加到 NSarray 或字典吗?

如何在 scala 中生成的键值对中添加值

如何在 Swift 中将键值对添加到类型为 [String:AnyObject] 的字典中?

Map 键值对

如何在 Scala 中将元素添加到 Map 中,其中键是字符串,值是 List[String]

怎么在 c++ 的 map 里面 放 key-map键值对