2016-07-08 4 views
0

ich eine Karte haben, lassen Sie uns sagen:scala: create Karte mit Schlüsseln aus map.keys

m1:Map[String, Int] = Map(a -> 1, b -> 2, c -> 3, d -> 4) 

und ich will jetzt eine zweite Karte schaffen, die die gleichen Schlüssel wie die vorhandene Karte hat und nimmt 0 als Wert für jeden Schlüssel. Also es sollte wie folgt aussehen:

m2:Map[String, Int] = Map(a -> 0, b -> 0, c -> 0, d -> 0) 

habe ich versucht, in der Karten-Definition eine for-Schleife, aber es funktioniert nicht wirklich. Wie kann ich das machen?

danke!

Antwort

5

Um eine neue Karte

m1.keys.map(k => (k,0)).toMap 

und mit einem

for ((k,v) <- m1) yield k -> 0 

Die Ansätze oben für das Verständnis, sollten Sie erstellen eine neue Karte erstellen. Dies steht im Gegensatz zur Verwendung von mapValues, die eine Sicht auf die ursprüngliche Map erstellt und die Transformationsfunktion beibehält, die bei jeder Abfrage auf die ursprüngliche Map angewendet wird. Soweit die Transformationsfunktion referenziell transparent ist, nämlich dass sie nicht von einem Kontext abhängig ist, ist dieser Ansatz stichhaltig. Wenn sich jedoch ein Kontext, auf den sich die Transformationsfunktion bezieht, ändert, kann sich auch die Ausgabe aus der Abfrage der ursprünglichen Zuordnung ändern. Dies wird verhindert, indem eine neue, transformierte Karte erstellt wird.

+0

arbeitete über die Referenz Auswirkungen Antwort der Ulme gelesen haben, danke! – dumm3rjung3

2

Sie könnten nur mapValues:

val m2 = m1.mapValues((v) -> 0) 

EDIT: @ perfekt