Scala无法使用默认值更改可变映射[Char,Map[Int,Double]]中的值

Scala无法使用默认值更改可变映射[Char,Map[Int,Double]]中的值,scala,maps,default-value,scala-collections,mutable,Scala,Maps,Default Value,Scala Collections,Mutable,由于完整代码前面的import语句,此代码中的所有映射都是可变映射。方法调用nGramGetter.getNGrams(…)返回一个Map[String,Int] def train(files: Array[java.io.File]): Map[Char, Map[Int, Double]] = { val scores = Map[Char, Map[Int, Double]]().withDefault( x => Map[Int, Double]().withDefa

由于完整代码前面的import语句,此代码中的所有映射都是可变映射。方法调用
nGramGetter.getNGrams(…)
返回一个Map[String,Int]

  def train(files: Array[java.io.File]): Map[Char, Map[Int, Double]] = {
    val scores = Map[Char, Map[Int, Double]]().withDefault( x => Map[Int, Double]().withDefaultValue(0.0)) 

    for{
      i <- 1 to 4
      nGram <- nGramGetter.getNGrams(files, i).filter( x => (x._1.size == 1 || x._2 > 4) && !hasUnwantedChar(x._1) )
      char <- nGram._1
    } scores(char)(i) += nGram._2
    println(scores.size)
    val nonUnigramTotals = scores.mapValues( x => x.values.reduce(_+_)-x(1) )    

    val unigramTotals = scores.mapValues( x => x(1) )

    scores.map( x => x._1 -> x._2.map( y => y._1 -> (if(y._1 > 1) y._2/unigramTotals(x._1) else (y._2-nonUnigramTotals(x._1))/unigramTotals(x._1)) ) )
  }
def列(文件:Array[java.io.File]):Map[Char,Map[Int,Double]={
val scores=Map[Char,Map[Int,Double]]()。使用默认值(x=>Map[Int,Double]()。使用默认值(0.0))
为了{
i 4)和&!Hasunnentedchar(x.(u 1))
字符x.values.reduce(+ux)-x(1))
val unigramTotals=分数.mapValues(x=>x(1))
scores.map(x=>x.\u1->x.\u2.map(y=>y.\u1->)(如果(y.\u1>1)y.\u2/unigramTotals(x.\u1)其他(y.\u2-unegramtotals(x.\u1))/unigramTotals(x.\u1)))
}

我用一些打印语句(打印每个键中的键、值和单个字符)替换了
分数(char)(I)+=nGram.\u 2
行要检查输出,方法调用不会返回空列表。但是,打印
分数大小的行打印的是零。我几乎可以肯定我以前使用过此方法填充频率映射,但这次,映射总是空的。我已将
withDefault
更改为
withDefault值
并将当前函数文本的结果作为参数传入。我已使用
映射[Int,Double](1->0.0,2->0.0,3->0.0,4->0.0)尝试了使用默认值
和使用默认值
。我有点像Scala noob,所以可能我只是不了解导致问题的语言。知道怎么回事吗?

使用默认值的
方法和使用默认值的
方法不会更改映射。相反,它们只返回默认值。让我们从语句中删除语法糖看看哪里出了问题:

scores(char)(i) += nGram._2
scores(char)(i) = scores(char)(i) + nGram._2
scores.apply(char)(i) = scores.apply(char)(i) + nGram._2
scores.apply(char).update(i, scores.apply(char).apply(i) + nGram._2)
现在,由于
scores.apply(char)
不存在,将返回一个默认值,
Map[Int,Double]()。withDefaultValue(0.0)
,该映射将被修改。不幸的是,它从未被分配到
分数
,因为没有对其调用
更新
方法。请尝试下面的代码--它未经测试,但要使其正常工作应该不难:

scores(char) = scores(char) // initializes the map for that key, if it doesn't exist
scores(char)(i) += nGram._2

现在效果很好。非常感谢!