Wie lautet die Syntax zum Hinzufügen eines Elements zu einer scala.collection.mutable.Map?

79

Wie lautet die Syntax zum Hinzufügen eines Elements zu einer scala.collection.mutable.Map?

Hier sind einige fehlgeschlagene Versuche:

val map = scala.collection.mutable.Map

map("mykey") = "myval"

map += "mykey" -> "myval"

map.put("mykey","myval")
Koala3
quelle
Ein solcher Kommentar zeigt, wie schlecht Scala-Funktionen benannt sind und wie eingängig sie sind!
Adelin

Antworten:

90

Der Punkt ist, dass die erste Zeile Ihrer Codes nicht Ihren Erwartungen entspricht.

Du solltest benutzen:

val map = scala.collection.mutable.Map[A,B]()

Sie haben dann mehrere gleichwertige Alternativen, um Elemente hinzuzufügen:

scala> val map = scala.collection.mutable.Map[String,String]()
map: scala.collection.mutable.Map[String,String] = Map()


scala> map("k1") = "v1"

scala> map
res1: scala.collection.mutable.Map[String,String] = Map((k1,v1))


scala> map += "k2" -> "v2"
res2: map.type = Map((k1,v1), (k2,v2))


scala> map.put("k3", "v3")
res3: Option[String] = None

scala> map
res4: scala.collection.mutable.Map[String,String] = Map((k3,v3), (k1,v1), (k2,v2))

Und ab Scala 2.13:

scala> map.addOne("k4" -> "v4")
res5: map.type = HashMap(k1 -> v1, k2 -> v2, k3 -> v3, k4 -> v4)
Eastsun
quelle
4
Leider ist bei Verwendung newder leeren Klammer nicht erforderlich.
Daniel C. Sobral
45

Wie immer sollten Sie sich fragen, ob Sie wirklich eine veränderbare Karte benötigen.

Unveränderliche Karten sind trivial zu erstellen:

val map = Map(
  "mykey" -> "myval",
  "myotherkey" -> "otherval"
)

Veränderbare Karten unterscheiden sich beim ersten Erstellen nicht:

val map = collection.mutable.Map(
  "mykey" -> "myval",
  "myotherkey" -> "otherval"
)

map += "nextkey" -> "nextval"

In beiden Fällen wird die Inferenz verwendet, um die richtigen Typparameter für die Map-Instanz zu ermitteln.

Sie können auch eine unveränderliche Karte in a speichern var. Die Variable wird dann jedes Mal, wenn Sie eine "Aktualisierung" durchführen, mit einer neuen unveränderlichen Karteninstanz aktualisiert.

var map = Map(
  "mykey" -> "myval",
  "myotherkey" -> "otherval"
)

map += "nextkey" -> "nextval"

Wenn Sie keine Anfangswerte haben, können Sie Map.empty verwenden:

val map : Map[String, String] = Map.empty //immutable
val map = Map.empty[String,String] //immutable
val map = collection.mutable.Map.empty[String,String] //mutable
Kevin Wright
quelle
2
Nehmen wir an, ich habe eine Klasse mit einem Kartenfeld und diese kann jederzeit aktualisiert werden. Ist es in Scala wirklich vorzuziehen, eine 'var' + unveränderliche Karte anstelle einer 'val' + veränderlichen Karte zu haben? Als erfahrener Java-Programmierer würde ich mich für die zweite Option entscheiden, aber von Ihrer Antwort gehe ich davon aus, dass die erste in der Scala-Welt häufiger vorkommt?
Omnomnom
1
Und wenn Sie mehrere Einträge gleichzeitig hinzufügen möchten:map ++ Seq("another1" -> "anotherVal1", "another2" -> "anotherVal2")
Brent Faust
18

Wenn du sagst

val map = scala.collection.mutable.Map

Sie erstellen keine Karteninstanz, sondern aliasen den Kartentyp.

map: collection.mutable.Map.type = scala.collection.mutable.Map$@fae93e

Versuchen Sie stattdessen Folgendes:

scala> val map = scala.collection.mutable.Map[String, Int]()
map: scala.collection.mutable.Map[String,Int] = Map()

scala> map("asdf") = 9

scala> map
res6: scala.collection.mutable.Map[String,Int] = Map((asdf,9))
Synesso
quelle
3

Erstellen Sie eine neue unveränderliche Karte:

scala> val m1 = Map("k0" -> "v0")   
m1: scala.collection.immutable.Map[String,String] = Map(k0 -> v0)

Fügen Sie der obigen Karte ein neues Schlüssel / Wert-Paar hinzu (und erstellen Sie eine neue Karte, da beide unveränderlich sind):

scala> val m2 = m1 + ("k1" -> "v1")             
m2: scala.collection.immutable.Map[String,String] = Map(k0 -> v0, k1 -> v1)
0nIce
quelle
2
var test = scala.collection.mutable.Map.empty[String, String]
test("myKey") = "myValue"
kkress
quelle
2

Erstellen Sie eine veränderbare Karte ohne Anfangswert:

scala> var d= collection.mutable.Map[Any, Any]()
d: scala.collection.mutable.Map[Any,Any] = Map()

Erstellen Sie eine veränderbare Karte mit Anfangswerten:

scala> var d= collection.mutable.Map[Any, Any]("a"->3,1->234,2->"test")
d: scala.collection.mutable.Map[Any,Any] = Map(2 -> test, a -> 3, 1 -> 234)

Vorhandenen Schlüsselwert aktualisieren:

scala> d("a")= "ABC"

Neuen Schlüsselwert hinzufügen:

scala> d(100)= "new element"

Überprüfen Sie die aktualisierte Karte:

scala> d
res123: scala.collection.mutable.Map[Any,Any] = Map(2 -> test, 100 -> new element, a -> ABC, 1 -> 234)
Andy Dong
quelle
0

var map: Map [String, String] = Map ()

var map1 = map + ("rot" -> "# FF0000")

println (map1)

Subhranil Ghosh
quelle
Dieses arme kleine Stück ängstlichen und einsamen Codes bittet um Gesellschaft und Schutz durch eine Erklärung.
Yunnosch
3
Willkommen bei SO. Bei so alten Fragen (die vor über 10 Jahren gestellt wurden) und bei so vielen bereits eingereichten Antworten ist es hilfreich, darauf hinzuweisen, wie Ihre Antwort dem Thema etwas Neues hinzufügt. Wie es ist, zeigt Ihr Beitrag einen sehr schlechten Scala-Stil.
Jwvh