Обновите изменяемое значение HashMap, которое является изменяемой коллекцией. - PullRequest
3 голосов
/ 26 декабря 2011

У меня есть карта, которая выглядит так: Map[ A -> Collection[B]]. Эта карта обновляется в цикле - однако особенность в том, что обновления в основном означают добавление элемента B в коллекцию [B] (для некоторого ключа A).

Я пытаюсь выяснить, могу ли я ускорить процесс, изменив тип моей Коллекции с List [] на ListBuffer [].

До сих пор мой код выглядел так (упрощенно):

var incoming = new HashMap[A, List[B]() {
  override def default(a: A) = List()
}
..
for(b < someCollectionOfBs){
  ..
  incoming(b.getA) = b :: incoming(b.getA)
  ..
}

Это отлично работает. Теперь я изменил тип карты, чтобы она выглядела так:

var incoming = new collection.mutable.HashMap[A, ListBuffer[B]() {
  override def default(a: A) = collection.mutable.ListBuffer()
}
..
for(b < someCollectionOfBs){
  ..
  incoming(b.getA) += b
  ..
}

Обратите внимание на изменение в том, как элемент B добавляется в коллекцию во 2-м примере (больше нет неизменяемого List, следовательно, нам не нужно создавать и назначать новую коллекцию ...).

Но . Это не работает: incoming(X) += .. не не обновляет значение карты для X, на самом деле это ничего не меняет.

Что мне здесь не хватает? Я думал, что смогу обновить значения изменяемого HashMap ... Итак, если мои значения являются изменяемыми коллекциями, почему я не могу просто добавить к ним элементы?

1 Ответ

8 голосов
/ 26 декабря 2011

Значение по умолчанию возвращается, когда ключ не найден, но оно не обновляет карту со значением по умолчанию.Вы можете использовать getOrElseUpdate для этого.

incoming.getOrElseUpdate(b.getA, ListBuffer()) += b

Это должно делать то, что вы хотите.

Дополнительные примечания:

Если вычто касается производительности, я не думаю, что замена List на ListBuffer принесет вам много пользы, потому что вы готовитесь к List, и это должно быть очень быстро.ListBuffer удобно, когда вы хотите добавить в список.Вы должны посмотреть на использование java.util.HashMap и посмотреть, поможет ли это.

...