Scalaでは、コレクションのコレクション、コレクションのリスト、マップのマップ、リストのセットなど、しばしば "長方形の"コレクションコレクションを転置する必要があります。コレクションの集合は、特定のドメインから共同ドメインへの写像として一貫して見ることができるので(List [A]/Array [A]はIntドメインからA co-ドメイン、セット[A]は、Aドメインからブールの共同ドメインなどへのマッピングです)、転置操作を行うためのきれいな汎用関数を記述したいと思います(例:リストのマップを転置マップのリスト)。しかし、()演算子以外の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) }
}
は、誰かが私には1つの汎用コレクション・オブ・コレクション転置にこれらのメソッドを統一助けることができますか?また、Scalaの便利な機能を学ぶのにも役立ちます。
ps:私は例外処理を無視して、入力コレクションを長方形と仮定しました。つまり、内側のコレクションのすべてのドメイン要素が同じセットを構成しています。
ありがとう - これは非常に便利です!あなたが使ったScalaの高度な機能のいくつかに慣れていないので、あなたがやったことを理解するのにかなり時間がかかりました(これらの機能をもっと詳細に学ぶのは大変申し訳ありません)。 – Ashwin