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

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)

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

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

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)

2
var test = scala.collection.mutable.Map.empty[String, String]
test("myKey") = "myValue"

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)

0

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

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

println (map1)


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.