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

これを単一のマップにフラット化するにはどうすればよいですか?私のアプローチは間違っていますか?

4

2 に答える 2

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
于 2012-12-22T21:11:11.353 に答える
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)))

最近、誰かがこの操作、つまり値をフラット化する必要があると言いました。今、これが彼の意図したことなのだろうか。

于 2012-12-22T23:19:15.743 に答える