Scala - 在不可变 Vector 中更新可变映射



我正在尝试在Scala中构建一个Vector[Map[String, Any]]。我知道 Vector 是不可变的,我使用的是可变的 Map。

当我尝试这样做时:

def calculate_objectives(pop: Vector[Map[String, Any]]): Unit ={
for (i <- 0 until pop_size){
pop(i) = pop(i) + ("weights" -> decode(pop(i)("genome").asInstanceOf[Vector[Int]]))
pop(i) = pop(i) + ("objective" -> Vector(objective1(pop(i)("weights").asInstanceOf[Vector[Float]]), objective2(pop(i)("weights").asInstanceOf[Vector[Float]])))
}
}

我不是在尝试更改矢量,只是更改矢量内的地图。这可能吗?

当我尝试编译此代码时,我得到两个相等的错误,我想知道这是否是问题所在。

Error:(102, 7) value update is not a member of Vector[scala.collection.mutable.Map[String,Any]]
pop(i) = pop(i) + ("weights" -> decode(pop(i)("genome").asInstanceOf[Vector[Int]]))

类型MapPredef中定义为scala.collection.immutable.Map

如果你想要一个具有可变映射的向量,那么你必须将类型显式声明为collection.mutable.Map,然后你必须update映射,而不是向量:

import scala.collection.mutable.{Map => MutMap}
def calculate_objectives(pop: Vector[MutMap[String, Any]]): Unit = {
for (i <- 0 until pop.size){
pop(i)("weights") = decode(pop(i)("genome").asInstanceOf[Vector[Int]])
pop(i)("objective") = Vector(
objective1(pop(i)("weights").asInstanceOf[Vector[Float]]), 
objective2(pop(i)("weights").asInstanceOf[Vector[Float]])
)
}
}

在这里,我使用了重命名导入,将collection.mutable.Map重命名为MutMap。如果需要,可以在pop的类型中写出完全限定名collection.mutable.Map

最新更新