【问题标题】:Scala - Update mutable maps inside immutable VectorScala - 更新不可变向量内的可变映射
【发布时间】:2018-05-12 21:04:38
【问题描述】:

我正在尝试在 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]]))

【问题讨论】:

    标签: scala dictionary vector


    【解决方案1】:

    Map 的类型是 defined in Predef as 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

    【讨论】:

    • 这就是我想要做的。我知道 Map 需要是可变的,而这已经完成了。但显然,我以错误的方式更新了地图。非常感谢!
    • @flyist 你的意思可能是 “我知道 Map 需要是可变的”,否则你无法就地更新任何内容。
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 2011-03-26
    • 1970-01-01
    • 2012-04-25
    • 2017-03-29
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多