Мне приходится часто переносить «прямоугольную» коллекцию коллекций в Scala, например: список карт, карту списков, карту карт, набор списков , отображение множеств и т. д. Так как коллекции можно равномерно рассматривать как отображение из определенной области в содомену (например: Список [A]/Array [A] - это отображение из области Int в A-кодовое пространство, domain, Set [A] - это отображение из домена A в булевский co-домен и т. д.), я хотел бы написать чистую общую функцию для выполнения операции транспонирования (например: превратить карту списков в транспонированную список карт). Однако у меня возникают проблемы, потому что кроме оператора() Scala, похоже, не имеет единого API для абстрактного отображения в виде сопоставлений?Транспонирование произвольных коллекций коллекций в Scala
Так что я в конечном итоге написание отдельного транспонирование для каждого типа коллекции-в-коллекции следующим образом:
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