我是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.foreach{x=>{
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.
谢谢!
答案 0 :(得分:1)
您遇到的问题是由使用var
来保存不可变Map
引起的。将其更改为持有可变val
的{{1}}并且有效。
Map
话虽如此,代码中还存在许多其他问题,这些问题使得Scala的处理方式成为非惯用语。
你真正想要的是更接近这一点。
val voteCount:collection.mutable.Map[String,Int] = collection.mutable.Map()
答案 1 :(得分:0)
Jwvh的答案是惯用的,但不明显,如果列表中有大量的重复内容,那么内存很重。
你也可以考虑这样做的字面意思(但仍然是Scalarific):
val voteCount = voteTypeList.foldLeft(Map(): Map[Int, Int]) { (v, x) =>
v + (x -> (v.getOrElse(x, 0) + 1))
}