问题描述
我想在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.Map
和ListBuffer
:
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)))