Обновление значения класса дела Scala внутри карты

Я имею:

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

Где WordCount является классом дел:

case class WordCount(name: String,
                 id: Int,
                 var count: Option[Double]) {

def withCount(v: Double) : WordCount = copy(count = Some(v))
}

И я пытаюсь обновить значения для count каждый раз, когда ключ существует на карте,

def insert(w1: String, w2: String, count: Double) = {
    if(targets.contains(w1)){
      var wc = targets.get(w1).getOrElse().asInstanceOf[WordCount]
      wc.withCount(9.0)
    } else{
      targets.put(w1, WordCount(w1, idT(), Some(0.0))
    }
}

Но это не работает. Как правильно это сделать? пожалуйста!

1 ответ

Решение

Призвание withCount не изменяет экземпляр класса дела, но создает новый. Поэтому вам придется снова сохранить вновь созданный экземпляр на карте:

def insert(w1: String, w2: String, count: Double) = {
  val newWC = targets.get(w1).fold {
    WordCount(w1, idT(), Some(0.0)
  } { oldWC =>
    oldWC.withCount(9.0)
  }
  targets.put(w1, newWC)
}

Обратите внимание targets.get(w1).fold: Get возвращает Option[WordCount], fold вызывает свой первый параметр, если его получатель Noneиначе (т.е. Some) он вызывает второй параметр и передает ему значение Some содержит.

Другие вопросы по тегам