我有一个Int-> Queue的地图,我一次向一个条目添加一个条目。在进程结束时,我需要迭代键和值(因为我想将队列转换为数组),但scala说地图中没有键/值。下面的一些简化代码用于说明目的。这里发生了什么?下面的m(4)的结果也令人费解。
setEditing
使用scala 2.10.3。
答案 0 :(得分:2)
您永远不会向地图添加任何内容。您正在获取您设置为默认值的可变队列并修改它。
答案 1 :(得分:1)
是的,您必须检查某个索引的Queue
是否已创建,但语法不一定非常费力。"
import scala.collection.mutable.Queue
val mutablemap = scala.collection.mutable.Map[Int, Queue[Int]]()
mutablemap(9) = mutablemap.lift(9).fold(Queue(99))(_ += 99)
mutablemap(2) = mutablemap.lift(2).fold(Queue(22))(_ += 22)
mutablemap(9) = mutablemap.lift(9).fold(Queue(19))(_ += 19)
mutablemap(2) = mutablemap.lift(2).fold(Queue(12))(_ += 12)
mutablemap(9) // res0: scala.collection.mutable.Queue[Int] = Queue(99, 19)
mutablemap(2) // res1: scala.collection.mutable.Queue[Int] = Queue(22, 12)
<强>更新强>
经过进一步思考,您的原始设计并没有太远。
import scala.collection.mutable.Queue
val mutablemap =
scala.collection.mutable.Map[Int, Queue[Int]]().withDefault(_ => Queue[Int]())
mutablemap(3) = mutablemap(3) += 37
mutablemap(3) = mutablemap(3) += 45
mutablemap(6) = mutablemap(6) += 60
mutablemap(6) = mutablemap(6) += 62
mutablemap(3) // res0: scala.collection.mutable.Queue[Int] = Queue(37, 45)
mutablemap(6) // res1: scala.collection.mutable.Queue[Int] = Queue(60, 62)
答案 2 :(得分:0)
利用puhlen的回答:
首先,我需要切换到可变地图。其次,使用withDefaultValue似乎与这个问题无关(这是违反直觉的)。
val mutablemap = scala.collection.mutable.Map[Int, Queue[Int]]()
在向地图添加键值对时,我必须费力地检查键是否首先存在(因为我不想销毁任何预先存在的键值对,因为我正在逐步建立队列):
if (mutablemap.contains(key)) {
// mutate the existing Queue
mutablemap(key) += new_value
} else {
// key was not in map; start a new Queue
mutablemap += key -> Queue[Int](first_value)
}