2013-04-02 42 views
0

我有一個模擬爲地圖[位置,播放器]的遊戲板。對於 我想將其轉換爲 Map [Player,Set [Location]]。舉個例子,如果我們簡化和 鍵和值使用的符號,我想要改造這個:將地圖[A,B]轉換爲地圖[B,設置[A]]並返回

Map('a -> 'X, 'b -> 'O, 'c -> 'X, 'd -> 'O) 

成這樣:

Map('O -> Set('b, 'd), 'X -> Set('a, 'c)) 

(我有一個解決方案出來了,而寫這問題,請在下面發表評論,或許還有其他更好的方法嗎?)

回答

2

分組後,您可以使用mapValues

m.groupBy(_._2).mapValues(_.keySet) 
+2

請注意mapValues(和filterKeys)。他們很懶/返回地圖上的視圖。 –

+0

我正在處理不可變的地圖。這應該表示我沒事吧? –

+1

在這個特定情況下,你很好。請記住,mapValues返回一個「視圖」,因此每次使用視圖時都會執行mapValues的閉包。如果傳遞給mapValues的閉包存在副作用,這是很危險的。有關示例,請參閱此要點:https://gist.github.com/davidandrzej/5006950 –

1

回答我自己,因爲我想出了一個相當優雅的解決方案,同時寫下了這個問題:

grid.groupBy(_._2).map(x => x._1 -> x._2.keySet) 

想知道是否有更好的方法。

-1
m.foldLeft(Map.empty[Symbol, Set[Symbol]].withDefaultValue(Set.empty)) { case (acc, (k, v)) => acc.updated(v, acc(v) + k) } 
+0

我看不出這可能比其他兩種解決方案是首選。它的作用既不明顯,也不更簡潔。 –

+0

這可能是因爲他們在接受的答案中評論過地圖上的懶/返回視圖? –

相關問題