在Scala中將Map[K, V]
轉換爲Map[V, Iterable[K]]
的最短/慣用方法是什麼?如何在scala中反轉地圖?
3
A
回答
7
馬呂斯的解決方案可以使用mapValues被簡化,
m.groupBy(_._2).mapValues(_.map(_._1))
樣品REPL會話,
scala> val m = Map(1 -> "foo", 2 -> "foo", 3 -> "bar", 4 -> "bar", 5 -> "baz")
m: Map[Int,String] = Map(5 -> baz, 1 -> foo, 2 -> foo, 3 -> bar, 4 -> bar)
scala> m.groupBy(_._2).mapValues(_.map(_._1))
res0: Map[String, Iterable[Int]] = Map(baz -> List(5), foo -> List(1, 2), bar -> List(3, 4))
3
這應該做的伎倆:
def invert[A, B](m: Map[A, B]): Map[B, Iterable[A]] = {
m.groupBy(_._2).map {
case (v, kvPairs) => (v, kvPairs.map(_._1))
}
}
此迭代在映射中的鍵 - 值對和組使用值的對(_._2
爲元組的第二個元素的吸氣劑)。
這爲我們提供了一個列表,其中第一個元素是值,第二個元素是包含原始映射中所有對的序列,其中第二個元素是該值的第二個元素。
最後,對於後面這些對中的每一個,我們只提取序列中的第一個元素 - 從而獲得一個值,以便在原始映射中映射到它的所有鍵。
相關問題
- 1. 如何反轉Scala中的IndexedSeq?
- 2. 反向字頻地圖Scala中
- 3. 如何在scala中返回地圖
- 4. 集合在Scala中,如何讓地圖
- 5. 將scala地圖轉換爲java地圖
- 6. 如何轉換用於Scala的地圖的Java地圖?
- 7. 如何輸出地圖的反轉[Java]
- 8. 如何迭代scala地圖?
- 9. 如何將此地圖/ flatMap轉換爲Scala中的理解?
- 10. 如何將JSON字符串轉換爲Scala中的地圖
- 11. 如何在Scala 2.10中反映註釋?
- 12. 反轉XML站點地圖
- 13. 如何在Scala地圖上獲得最小值地圖
- 14. 如何在php中反轉
- 15. 將Scala地圖轉換成java字典
- 16. Spark scala - 嵌套StructType轉換爲地圖
- 17. scala從地圖轉換爲數據框
- 18. 如何使用Spark的地圖轉換在Scala中返回多個鍵值對?
- 19. 如何在Scala中爲地圖調用編寫隱式函數轉換
- 20. 如何反轉圖像
- 21. 如何將嵌套的複雜Scala地圖轉換爲Java
- 22. 在沒有地圖鍵的Scala中將地圖轉換爲列表?
- 23. 如何將彩色地圖圖像反轉爲標量值
- 24. Bing地圖V8 - 如何在Bird's Eye視圖中旋轉地圖?
- 25. 地圖中的flatMap如何在scala中工作?
- 26. 如何在Scala中分割地圖中的值?
- 27. 在Scala中將xml轉換爲對象/地圖
- 28. 如何在scala中轉置數據集?
- 29. 如何匹配scala的值地圖
- 30. Scala:如何合併地圖集合
雖然這是真的,這個問題重疊外,對其他頂級答案假設地圖被倒置的是一個注入(沒有兩個鍵映射到相同的值)。對於這個問題並非如此,這是一個關鍵的區別。此外,這個問題使用標準術語「反轉」而不是「反轉」。也許這個問題應該改爲「我怎樣才能在Scala中反轉一個非內射映射?」另一個是「我怎樣才能在Scala中反轉一個單射映射?」 – AmigoNico 2013-04-07 18:34:23