Scala:将地图展平为地图

时间:2012-12-22 20:55:12

标签: scala map

我有以下两个列表:

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

如何将其展平为单个地图?我的做法错了吗?

2 个答案:

答案 0 :(得分:3)

首先,答案是:

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

正如您所看到的,您非常接近,但您过早地调用了Map()(即Map.apply())。相反,您应该首先创建一个元组列表,因为您可以将一系列元组传递给Map.apply()

更新:正如aztek所说,这可以简化:

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

答案 1 :(得分:1)

或者,如果parens使你的眼睛晃动,

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

最近有人说他经常要做这个操作,即压扁价值观;现在我想知道这是不是他的意思。