2012-12-22 71 views
0

我有以下2所列出:斯卡拉:壓扁圖成圖

val a = List(List(1,2,3),List(2,3,4),List(3,4,5)) 
val b = List(1,2,3) 

我想過濾的a包含的元素在b元素,並將它們添加到地圖像這樣:

Map(1 -> List(List(1, 2, 3)), 2 -> List(List(1, 2, 3), List(2, 3, 4)), 3 -> List(List(1, 2, 3), List(2, 3, 4), List(3, 4, 5))) 

我試過如下:

b.map(x => Map(x -> a.filter(y => y contains x))) 

,但它給了我

List(Map(1 -> List(List(1, 2, 3))), Map(2 -> List(List(1, 2, 3), List(2, 3, 4))), Map(3 -> List(List(1, 2, 3), List(2, 3, 4), List(3, 4, 5)))) 

我該如何將它拼合成一個Map?我的方法錯了嗎?

回答

3

首先,答案:

Map(b.map(i => (i, a.filter(_.contains(i)))):_*) 

正如你所看到的,你是相當接近,但你叫Map()(即Map.apply())過 '早'。相反,您應該首先創建一個元組列表,因爲您可以將一系列元組傳遞給Map.apply()

更新:作爲阿茲特克說,這可以簡化爲:

b.map(i => (i, a.filter(_.contains(i)))).toMap 
+2

這裏不需要'Map.apply()',這裏有一個'.toMap'方法,它將2元組列表轉換爲地圖。 – aztek

1

另外,如果括號讓你的眼睛驚奇,

scala> for (k <- b; c <- a; if c contains k) yield k -> c 
res4: List[(Int, List[Int])] = List((1,List(1, 2, 3)), (2,List(1, 2, 3)), (2,List(2, 3, 4)), (3,List(1, 2, 3)), (3,List(2, 3, 4)), (3,List(3, 4, 5))) 

scala> .groupBy(_._1) 
res5: scala.collection.immutable.Map[Int,List[(Int, List[Int])]] = Map(2 -> List((2,List(1, 2, 3)), (2,List(2, 3, 4))), 1 -> List((1,List(1, 2, 3))), 3 -> List((3,List(1, 2, 3)), (3,List(2, 3, 4)), (3,List(3, 4, 5)))) 

scala> .mapValues(_.map(_._2)) 
res6: scala.collection.immutable.Map[Int,List[List[Int]]] = Map(2 -> List(List(1, 2, 3), List(2, 3, 4)), 1 -> List(List(1, 2, 3)), 3 -> List(List(1, 2, 3), List(2, 3, 4), List(3, 4, 5))) 

最近有人說,他經常要做到這一點操作,即扁平化值;現在我想知道這是不是他的意思。