2017-01-12 8 views
1

Map[Long, Set[Long]]Map[Long, Long]に変換しようとしています。マップを反転する[Long、[Long]をマップに設定する[Long、Long]

私はこれを試してみましたが、問題をコンパイルした:

m.map(_.swap).map(k => k._1.map((_, k._2))) 

例:

Map(10 -> Set(1,2,3), 11 -> Set(4,5)) 

はなるはずです。

Map(1 -> 10, 
    2 -> 10, 
    3 -> 10, 
    4 -> 11, 
    5 -> 11) 
+1

達成しようとしていることはありますか?結果マップのキーと値は何ですか? – slouc

+0

各値はキーであり、そのキーの値がキーです。私はQを更新します –

答えて

1

はあなたMap[Long, Set[Long]]次のとおりです。Map[A,B]

in./:(Map.empty[Long, Long]) { case (acc, (key, values)) => acC++ values.map(_ -> key) } 
1

明確にするために、あなたはこの持っているように思える:

Map(10 -> Set(1,2,3), 11 -> Set(4,5)) 

そして、あなたは他のマップに、このマップに変換したいのですが、このようなもので:

セットは一部のキーが存在しないこととなったマップでは、互いに素でない場合は、あなたが見ることができるように
Map(1 -> 10, 
    2 -> 10, 
    3 -> 10, 
    4 -> 11, 
    5 -> 11) 

を考慮して、これを持って、コードは次のようになります。

val m: Map[Long, Set[Long]] = Map(10l -> Set(1l,2l,3l), 11l -> Set(4l,5l)) 

m.map(_.swap).map(k => k._1.map((_, k._2))) 

val foo: Iterable[(Long, Long)] = m.flatMap { t => 
    val (key, value) = t 
    value.map(_ -> key) 
} 

val result: Map[Long, Long] = foo.toMap 
+0

鍵はどのように失われますか? –

+0

マップ上で繰り返しキーを使うことができないので、Map(10l - > Set(1l、2l、3l、4l)、11l - > Set(4l、5l))と同じ例を試してみてください。 – damdev

+0

値は一意であることが保証されます。同じキーを指し示す値はありません。 –

1

これはMap[Long, Set[Long]]からMap[Long, List[Long]]にごMapmを反転します。

m flatten {case(k, vs) => vs.map((_, k))} groupBy (_._1) mapValues {_.map(_._2)} 

さまざまSet値が同じLong S(すなわちMap(8 -> Set(1,2), 9 -> Set(2,3)))の一部が含まれている場合にどうするか指定していません。もし起こらないと確信が持てば、次の調整をすることができます。

m flatten {case(k, vs) => vs.map((_, k))} groupBy (_._1) mapValues {_.head._2} 

またはそれ以上単純:inを想定し

m.flatten {case(k, vs) => vs.map((_, k))}.toMap 
+0

それは起こりません、値はすべて一意であり、同じキーを指すことはありません。結果はMap [Long、List [Long]]ではなく、Map [Long、Long]でなければなりません –

3

flatMapタプルのコレクションを "ただ働き" になります。

m.flatMap {case (k,v) => v.map(_ -> k)} // Map[Long,Long] 

Map[Long,Set[Long]]からSet[(Long,Long)]の系列になり、Map[Long,Long]に平坦化されます。

関連する問題