У меня есть карта, которая выглядит так: 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 ... Итак, если мои значения являются изменяемыми коллекциями, почему я не могу просто добавлять к ним элементы?
А, это злой уловка. :) Спасибо. – fgysin
О производительности: создание списков не то, что меня беспокоит, но и фактическое создание новых экземпляров List. Кроме того, со скоростью, которую это делается в моем коде, сбор мусора - проблема, и создание меньше объектов должно определенно помочь мне там ... – fgysin