Scala-Sammlungen, einzelne Schlüssel, mehrere Werte
Ich habe eine Liste von übergeordneten Schlüsseln, von denen jeder möglicherweise null oder mehr zugehörige Werte haben könnte. Ich bin nicht sicher, welche Sammlung ich verwenden soll.
ich benutzeMap[Int,List[String]]
Ich erkläre die Karte als
<code>var nodes = new HashMap[Int, List[String]] </code>
Dann habe ich zwei Methoden, um neue Elemente hinzuzufügen. Der erste besteht darin, neue Schlüssel hinzuzufügenaddNode
und die zweite besteht darin, neue Werte hinzuzufügenaddValue
. Zu Beginn sind dem Schlüssel keine Werte zugeordnet. Später, während der Ausführung, werden neue Werte zugeordnet.
<code>def addNode(key: Int) = nodes += (key -> "") def addValue(key: Int, value: String) = ??? </code>
Ich bin nicht sicher, wie ich es umsetzen solladdValues
Als Antwort auf @ oxbow-lakes antworte: Dies ist der Fehler, den ich erhalte. Bitte beachten Sie, dass mit Schlüsseln keine Werte verknüpft sein müssen.
<code>scala> var nodes = Map.empty[Int, List[String]] nodes: scala.collection.immutable.Map[Int,List[String]] = Map() scala> nodes += (1->null) scala> nodes += (1 -> ("one" :: (nodes get 1 getOrElse Nil))) java.lang.NullPointerException at .<init>(<console>:9) at .<clinit>(<console>) at .<init>(<console>:11) at .<clinit>(<console>) at $print(<console>) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704) at scala.tools.nsc.interpreter.IMain$Request$$anonfun$14.apply(IMain.scala:920) at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43) at scala.tools.nsc.io.package$$anon$2.run(package.scala:25) at java.lang.Thread.run(Thread.java:680) </code>Update 2:
Das Problem mit dem obigen Code ist die Zeilenodes += (1->null)
Der Schlüssel sollte mit verknüpft seinNil
stattdessen. Unten ist der Arbeitscode.
<code>scala> var nodes = Map.empty[Int, List[String]] nodes: scala.collection.immutable.Map[Int,List[String]] = Map() scala> nodes += (1->Nil) scala> nodes += (1 -> ("one" :: (nodes get 1 getOrElse Nil))) scala> nodes res27: scala.collection.immutable.Map[Int,List[String]] = Map(1 -> List(one)) </code>