2017-02-23 6 views
0

Wie kann ich Karten verschmelzen wie unten:Scala zwei Karte verschmelzen

val map1 = Map(1 -> "a", 2 -> "b") 
val map2 = Map("a" -> "A", "b" -> "B") 

Nach fusioniert.

Merged = Map(1 -> List("a", "A"), 2 -> List("b", "B")) 

Kann Liste, Set oder jede andere Sammlung sein, die Größenattribut hat.

+0

http://www.scala-lang.org/api/current/scala/collection/Map.html sollten Sie versuchen ++ ?? – Pavel

+1

http://StackOverflow.com/Questions/20047080/Scala-merge-map hier ist eine ähnliche Frage –

Antwort

1

Ich bin mir nicht sicher, ob ich verstehe, was Sie genau suchen, sondern dass für die vorgesehene Beispiel zu erzielen, die Sie tun können:

val map1 = Map(1 -> "a", 2 -> "b") 
val map2 = Map("a" -> "A", "b" -> "B") 

map1.mapValues(value => (value, map2(value))) 

aber Sie sollten vorsichtig sein, jeden Wert von a als ein haben Geben Sie b ein (ich nahm an, dass dies aus dem angegebenen Beispiel geschieht).

+0

Danke für die Lösung, es ist, was ich gesucht habe, für Ihr Verständnis, ich arbeite an Scala/Spark SQL Zeug also ist es etwas komplex zu erklären ... aber es ist die Art der Zuordnung, die wir für zwei verschiedene Tabellen machen, und ich brauchte eine Art Mapping für die Problembeschreibung, wo ich meine Logik durchsetzen kann. Danke nochmal Kudos! –

+0

Ich bin froh, dass ich dir helfen konnte! :) –

1

Gegeben zwei Karten mit value1 als key2

scala> val x = Map(1 -> "a", 2 -> "b") 
x: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b) 

scala> val y = Map("a" -> "A", "b" -> "B") 
y: scala.collection.immutable.Map[String,String] = Map(a -> A, b -> B) 

Merge als Map(k1 -> List(v1, v2))

scala> val z = x.map { case (k1, v1) => (k1, List(v1, y(v1))) } 
z: scala.collection.immutable.Map[Int,List[String]] = Map(1 -> List(a, A), 2 -> List(b, B)) 

Sie müssen grundsätzlich Wert aus der ersten Karte erhalten dann die zweite Karte Nachschlag, und erstellen Sie einfach eine Liste von denen (v1, v2).

+0

Danke, genau das habe ich getan. –

1

Try This

scala> val map1 = Map(1 -> "a", 2 -> "b") 
map1: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b) 

scala> val map2 = Map("a" -> "A", "b" -> "B") 
map2: scala.collection.immutable.Map[String,String] = Map(a -> A, b -> B) 

scala> map1.zip(map2).map(x=>x._1._1 -> List(x._2._1,x._2._2)) 
res44: scala.collection.immutable.Map[Int,List[String]] = Map(1 -> List(a, A), 2 -> List(b, B)) 
+1

Netter Ansatz, obwohl ich es nicht wirklich versucht habe, werde dies sicherlich in zukünftigen Codes versuchen. Vielen Dank! –