2016-10-06 11 views
0

私はスカラーにとって非常に珍しく、キーが候補であり、値が投票数であるハッシュマップを作成したいと考えています。このようなもの:{(1:20)、(2:4)、(3:42)、..}。スカラーのMapにキーと値のペアを追加する

I`veは、次のコードを用いて試み:

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が作成され、0

はありがとうリターンを.sizeません!

答えて

1

問題は、varを使用して不変のMapを保持することによって発生します。それを変更可能なMapを保持するvalに変更してください。

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

は、それ以外の慣用物事のScalaの道にするコードと他の多くの問題があると述べました。

あなたが本当にしたいことは、これに近いものです。

+0

は、私は今、ビッグデータを扱う際のforeachが悪いことを実現します、ありがとうございます。いくつかのグーグル・グーグルの後、私はこれらの単純な行に来ました。 :) valletTypeList = textFile.map(x =>(x(2)、1)) valletCount = voteTypeList reduceByKey((a、b)=> a + b) – torjussa

+0

実行可能なソリューションを思いついたことをうれしく思いますしかし、 'foreach'は**大きなデータを扱うときに悪い**ではありません。それは戻り値を持たない(実際には 'Unit'を返す)ために使用されることはめったにありませんが、代わりに副作用を介して動作します。 – jwvh

0

Jwvhの答えは慣用的ではありませんが、明らかではありません。リストには重複数が非常に多い場合、メモリが重くなります。あなたもこれを行うのリテラル志向(それでもScalarific)の方法を検討してください

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