在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
引起的。将其更改为持有可变Map
的val
即可。
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 或字典吗?
如何在 Swift 中将键值对添加到类型为 [String:AnyObject] 的字典中?