Вместо удаления элемента из ArrayBuffer
после проверки, существует ли он, вы можете попробовать использовать операцию filter
вместо:
trait MultiMap[K, V] {
private final val map: mutable.Map[K, ArrayBuffer[V]] = mutable.Map.empty[K, ArrayBuffer[V]]
def values(): Seq[V] = map.values.flatten.toSeq
def remove(value: V): Unit = map.values.foreach(_.filter(_ != value))
}
это не будет O(N^2)
, если N
общее число значений, но поскольку filter
создает новый экземпляр буфера каждый раз, возможно, это может быть еще одним снижением производительности.
ОБНОВЛЕНИЕ
Еще один вариант, чтобы достичь почти O(1)
или, точнее, O(M)
, где M
количество дубликатов значений, предназначено для создания другого индекса или карты, но для значений и информации о том, где они расположены (введите основную карту и индекс в буфере):
import scala.collection.mutable._
trait MultiMap[K, V] {
private final val map: Map[K, ArrayBuffer[V]] = Map.empty
private final val valuesIndex: Map[V, ArrayBuffer[(K, Int)]] = Map.empty
def add(key: K, value: V): Unit = {
map += key -> map.get(key).fold(ArrayBuffer(value))(_ += value)
valuesIndex += value -> valuesIndex.get(value).fold(ArrayBuffer(key -> 0))(_ += (key -> (map(key).length - 1)))
}
def remove(value: V): Unit = {
valuesIndex.getOrElse(value, ArrayBuffer.empty).foreach {
case (key, index) => map(key).remove(index)
}
valuesIndex.remove(value)
}
}
Надеюсь, это поможет!