我必須經常在斯卡拉轉置一個「矩形」集合集合,例如:地圖列表,地圖列表,地圖地圖,一組列表,集合映射等等。由於集合可以統一地被視爲從特定域到共同域的映射(例如:List [A]/Array [A]是從Int域到A域的映射,域,Set [A]是從A域到布爾共域等的映射),我想編寫一個乾淨的泛型函數來執行轉置操作(例如:將列表映射到轉置地圖列表)。但是,我遇到了麻煩,因爲除了()運算符之外,Scala似乎沒有統一的API來抽象地將集合視爲映射?在斯卡拉轉置任意集合集合
所以我寫出來一個單獨的轉置爲每種類型的資源集合的,集合如下:
def transposeMapOfLists[A,B](mapOfLists: Map[A,List[B]]) : List[Map[A,B]] = {
val k = (mapOfLists keys) toList
val l = (k map { mapOfLists(_) }) transpose;
l map { v => (k zip v) toMap }
}
def transposeListOfMaps[A,B](listOfMaps: List[Map[A,B]]) : Map[A,List[B]] = {
val k = (listOfMaps(0) keys) toList
val l = (listOfMaps map { m => k map { m(_) } }) transpose;
(k zip l) toMap
}
def transposeMapOfMaps[A,B,C](mapOfMaps: Map[A,Map[B,C]]) : Map[B,Map[A,C]] = {
val k = (mapOfMaps keys) toList
val listOfMaps = k map { mapOfMaps(_) }
val mapOfLists = transposeListOfMaps(listOfMaps)
mapOfLists map { p => (p._1, (k zip p._2) toMap) }
}
有人可以幫助我統一這些方法爲一個泛型集合 - 的 - 藏品轉?它也將幫助我(並確信其他人)在此過程中學習一些有用的Scala特性。
ps:我忽略了異常處理,並假定輸入集合的集合是矩形的,即所有內部集合的域元素構成相同的集合。
謝謝 - 這是非常有用的!我花了相當一段時間才明白你已經完成了什麼,因爲我不熟悉你使用過的Scala的一些高級功能(現在我更加詳細地學習這些功能是一個很好的藉口!)。 – Ashwin