我必须经常在斯卡拉转置一个“矩形”集合集合,例如:地图列表,地图列表,地图地图,一组列表,集合映射等等。由于集合可以统一地被视为从特定域到共同域的映射(例如: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