在Scala中为Map添​​加键值对

时间:2016-10-06 03:28:56

标签: scala hashmap bigdata

我是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.

谢谢!

2 个答案:

答案 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))
  }