2011-12-26 3 views
1

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

Я пытаюсь выяснить, могу ли я получить ускорение, изменив тип моей коллекции из списка [] в 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-ом примере (не более неизменного списка, следовательно, нам не нужно создавать и назначать новую коллекцию ...).

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

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

ответ

6

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

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

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

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

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

+0

А, это злой уловка. :) Спасибо. – fgysin

+0

О производительности: создание списков не то, что меня беспокоит, но и фактическое создание новых экземпляров List. Кроме того, со скоростью, которую это делается в моем коде, сбор мусора - проблема, и создание меньше объектов должно определенно помочь мне там ... – fgysin

 Смежные вопросы

  • Нет связанных вопросов^_^