2017-01-12 70 views
1

試圖將Map[Long, Set[Long]]轉換爲Map[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

假設in是你Map[Long, Set[Long]]

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))這是因爲在Map上你不能有重複的鍵。 – damdev

+0

值保證是唯一的。所以不會有指向同一個關鍵的價值。 –

1

這將反轉您MapmMap[Long, Set[Long]]Map[Long, List[Long]]

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} 

或者更簡單地說:

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

它不會發生,值都是唯一的,不會指向相同的密鑰。結果必須是一個Map [Long,Long]而不是Map [Long,List [Long]] –

3

flatMapMap[A,B]會 「只是工作」 與元組的集合:

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

Map[Long,Set[Long]]變爲一系列Set[(Long,Long)],變得平坦到Map[Long,Long]