如何在mutable.Map中为键添加新元素?

问题描述

我想在Scala的Keys中向mutable.Map连续添加值。每个键的值都为Tuple2[Double,Int]的类型。 我使用以下代码定义mutable.Map

val my_var: mutable.Map[Int,(Double,Int)] = new mutable.HashMap[Int,Int)]

我使用以下代码添加新值:

my_var += (1 -> (2.5,3))
my_var += (1 -> (4.5,1))
my_var += (2 -> (1.5,1))

但是例如,对于key=1,仅存储最后的值。但是我想存储分配给特定键的所有值。我想要的最终结果如下所示:

(1,((2.5,3),(4.5,1),...))
...

解决方法

如果您一直想要可变性,我可以在其中使用mutable.MapListBuffer

import scala.collection.mutable

val map = mutable.Map.empty[Int,mutable.ListBuffer[(Double,Int)]]

implicit class AppendOps[K,V](private val map: mutable.Map[K,mutable.ListBuffer[V]]) {
  def append(key: K,value: V) = {
    map.updateWith(key) {
      case Some(list) => Some(list.append(value))
      case None       => Some(mutable.ListBuffer(value))
    }
  }
}

map.append(1,(2.5,3))
map.append(1,(4.5,1))
map.append(2,(1.5,1))

// map:
// mutable.Map[Int,Int)]] = HashMap(
//   1 -> ListBuffer((2.5,3),1)),//   2 -> ListBuffer((1.5,1))
// )
,

对于List值,使用Map之类的可增长集合代替元组,并使用空列表作为默认值。

import scala.collection.mutable

val my_var = new mutable.HashMap[Int,List[(Double,Int)]]
               .withDefaultValue(Nil)

现在更新有些冗长,但是一切正常。

my_var += 1->((2.5,3)::my_var(1))
my_var += 1->((4.5,1)::my_var(1))
my_var += 2->((1.5,1)::my_var(2))

my_var //Map(1 -> List((4.5,1),3)),2 -> List((1.5,1)))