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 に答える