为什么我的地图声称在添加密钥后没有密钥?

时间:2017-06-13 23:03:52

标签: scala

我有一个Int-> Queue的地图,我一次向一个条目添加一个条目。在进程结束时,我需要迭代键和值(因为我想将队列转换为数组),但scala说地图中没有键/值。下面的一些简化代码用于说明目的。这里发生了什么?下面的m(4)的结果也令人费解。

setEditing

使用scala 2.10.3。

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)
}