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 ) }
}
誰かがこれらのメソッドを1つの一般的なコレクションのコレクションの転置に統合するのを手伝ってもらえますか?また、私(そして他の人も)がその過程でいくつかの便利なScala機能を学ぶのに役立ちます。
ps:例外処理を無視し、コレクションの入力コレクションが長方形であると想定しました。つまり、内部コレクションのすべてのドメイン要素が同じセットを構成します。