我必须经常在 Scala 中转置一个“矩形”集合集合,例如:映射列表、列表映射、映射映射、列表集、集合映射等。因为集合可以统一被视为从特定域到共域的映射(例如: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:我忽略了异常处理并假设输入集合是矩形的,即所有内部集合的域元素构成相同的集合。