Deepesh Rehi
Deepesh Rehi

Reputation: 927

Scala two map merge

How can I merge maps like below:

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

After merged.

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

Can be List, Set or any other collection who has size attribute.

Upvotes: 1

Views: 352

Answers (3)

Dhirendra
Dhirendra

Reputation: 309

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

Upvotes: 1

prayagupadhyay
prayagupadhyay

Reputation: 31222

Given two maps with value1 as 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 as 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))

You basically need to get value from first map then lookup the second map, and just create a List out of those (v1, v2).

Upvotes: 1

Andrei T.
Andrei T.

Reputation: 2480

I'm not sure I understand what are you searching for exactly, but to achieve that for the provided example you could do:

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

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

However you should be careful to have every value from a as a key in b (I just assumed this happens from the provided example).

Upvotes: 1

Related Questions