我有以下两个列表:
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))))
如何将其展平为单个地图?我的做法错了吗?
答案 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)))
最近有人说他经常要做这个操作,即压扁价值观;现在我想知道这是不是他的意思。