Scala - обновление изменяемых карт внутри неизменного вектора - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь построить Vector [Map [String, Any]] в Scala.Я знаю, что Vector является неизменным, и я использую изменяемую карту.

Когда я пытаюсь сделать это:

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]]))

1 Ответ

0 голосов
/ 13 мая 2018

Тип Map равен , определен в Predef как 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. Если хотите, вы можете написать полное имя collection.mutable.Map в виде pop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...