1

我有以下代码

object DispatchLibrary
{
  private var nodes = Map.empty[java.util.UUID, List[BigInt]]

  def addNode(uuid: java.util.UUID) = if(nodes contains uuid) nodes else (nodes += (uuid -> Nil))

  def addValue(uuid: java.util.UUID, value: BigInt) = nodes + (uuid -> (value :: (nodes get uuid getOrElse Nil)))

  //def getValue(uuid: java.util.UUID) : List[BigInt] = ???

  //def getValues() : List[BigInt] = ???

  def calculated(): Boolean = !nodes.exists(_._1 eq null)

  def main(args: Array[String]) : Unit =
  {
    val uuid = java.util.UUID.randomUUID()

    addNode(uuid)
    addValue(uuid, BigInt(999))
    addValue(uuid, BigInt(9999))

    nodes foreach {case (key, value) => println (key + "->" + value)}
  }
}

在 IntelliJ IDEA 中运行上述代码会得到类似于以下输出的内容

8b2b4a7b-3e65-4de0-9035-8ee1d2910983->List()

我不确定为什么没有打印列表。

从 REPL 运行类似的代码会给出预期的输出

scala> var nodes = Map.empty[Int, List[BigInt]]
nodes: scala.collection.immutable.Map[Int,List[BigInt]] = Map()

scala> nodes += (1->Nil)

scala> nodes += (1 -> (BigInt(999) :: (nodes get 1 getOrElse Nil)))

scala> nodes += (1 -> (BigInt(9999) :: (nodes get 1 getOrElse Nil)))

scala> nodes foreach {case (key, value) => println (key + "-->" + value )}
1-->List(9999, 999)

如果您能帮助我编写评论的方法,我也将不胜感激。

4

1 回答 1

4

在您addValue编写的方法nodes + (uuid -> (value :: (nodes get uuid getOrElse Nil)))中,它不会更改中的列表nodes,而只会创建一个具有添加值的新副本。由于Map默认情况下是不可变的,因此您必须像=在方法中使用 -sign一样存储它addNode

它打印任何内容的原因是因为第一个条目由 UUID(字符串)和 Nil(空列表)组成。“8b2b4a7b-3e65-4de0-9035-8ee1d2910983”是有道理的,因为它是 UUID。“List()”是打印 Nil 的结果(因为它是一个空列表)。

你有它。尝试改写node += ...addValue

于 2012-05-13T21:36:27.303 回答