Scala在迭代时更新地图中的值

时间:2014-10-28 20:05:04

标签: scala map

我正在尝试在迭代此

时更新map [String,WordCount]中的值
case class WordCount(name: String,
                 id: Int,
                 var count: Double,
                 var links: scala.collection.mutable.HashMap[String, Double],
                 var ent: Double) {

    def withEnt(v: Double): WordCount = {println(s"v: $v"); copy(ent = v)}
}

var targets = mutable.HashMap[String, WordCount]()

函数calEnt是:

def calEnt(total: Double, links: scala.collection.mutable.HashMap[String, Double]): Double = {
    var p: Double = 0.0
    var ent: Double = 0.0
    links.map(d => {
      p = d._2 / total
      ent -= p * Math.log(p)
    })
    return ent
  }

我正在使用:

targets.map(m => m._2.withEnt(calEnt(m._2.count, m._2.links)))

用于迭代地图并计算ent的新值,并使用withEnt进行更新。我可以在控制台中控制新值,但它没有在地图中设置。这样做的方法是什么?请。

2 个答案:

答案 0 :(得分:5)

使用foreach:

targets.foreach(m => targets(m._1) = m._2.withEnt(calEnt(m._2.count, m._2.links)))

自包含的例子:

val m = scala.collection.mutable.HashMap[Int, Int](1 -> 1, 2 -> 2)
println(m)
m.foreach(p => m(p._1) = p._2 + 1)
println(m)

答案 1 :(得分:3)

map方法不会修改您的targets HashMap。它将返回一个新的,修改过的HashMap。试试这个:

targets = targets.map(m => (m._1, m._2.withEnt(calEnt(m._2.count, m._2.links))))

另请注意,我们会映射到一对键m._1和修改后的值。不仅仅是价值观。