A menudo tengo que transponer una colección de colecciones "rectangular" en Scala, por ejemplo: una lista de mapas, un mapa de listas, un mapa de mapas, un conjunto de listas , un mapa de conjuntos, etc. Dado que las colecciones se pueden ver de manera uniforme como un mapeo de un dominio específico a un co-dominio (por ej .: una Lista [A]/Array [A] es una asignación del dominio Int al co-A dominio, Set [A] es un mapeo desde el dominio A hasta el co-dominio booleano, etc.), me gustaría escribir una función limpia y genérica para hacer una operación de transposición (por ejemplo: convertir un mapa de listas en el transpuesto lista de mapas). Sin embargo, estoy teniendo problemas porque, aparte del operador(), Scala no parece tener una API unificada para ver las colecciones de forma abstracta como asignaciones.Transposición de colecciones arbitrarias de colecciones en Scala
Así que terminan escribiendo una transposición separado para cada tipo de colección de colecciones de la siguiente manera:
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) }
}
Puede alguien me ayude a unificar estos métodos en uno colecciones colección de transposición genéricos? También me ayudará (y estoy seguro de que otros) aprenden algunas características útiles de Scala en el proceso.
ps: He ignorado el manejo de excepciones y he asumido que la colección de colecciones de entrada es rectangular, es decir, todos los elementos de dominio de las colecciones internas constituyen el mismo conjunto.
Gracias - ¡esto es muy útil! Me tomó bastante tiempo entender lo que has hecho porque no estoy familiarizado con algunas de las funciones avanzadas de Scala que has utilizado (¡es una gran excusa para que aprenda estas características con más detalle ahora!). – Ashwin