私はSeq[(A, B)]
を持っています。そのようなコレクションに暗黙のメソッドを追加して、.toMultiMap
を取得してMap[A, Seq[B]]
に戻すことができます。Scalaの一般的なコレクションのコレクション
implicit class PairsExtensions[A, B](t: Traversable[(A, B)]) {
def toMultiMap: Map[A, Traversable[B]] = t.groupBy(_._1).mapValues(_.map(_._2))
}
しかし、今の問題は、私は常に値に対するTraversable
を取り戻すです:
これが私の最初の試みでした。 Set[(A, B)].toMultiMap
の場合はMap[A, Set[B]]
に戻したいです。それは動作しません、
implicit class PairsExtensions2[A, B, Repr[_] <: Traversable[(A, B)]](t: TraversableLike[(A, B), Repr[(A, B)]]) {
def toMultiMap(implicit bf: CanBuild[B, Repr[B]]): Map[A, Repr[B]] = t.groupBy(_._1).mapValues(_.map(_._2))
}
:しかし
val m1: Map[Int, Set[String]] = Set.empty[(Int, String)]
val m2: Map[Int, List[String]] = List.empty[(Int, String)]
これを行う方法を教えて
だから、私はこのような何かを試してみましたか?
メートル-ZL @申し訳ありませんが、明確にするために、最初の試みは、コンパイルした作品。 2番目のスニペットはコンパイルされません。私はちょうど私の試みを投稿していました。 – pathikrit
ちょうど私の2セントです: 'Set'の' .toMultiMap'が 'Map [A、Set [B]']を与えるのが本当に理にかなっているかどうか再考したいかもしれません。前者と後者のコレクションの一意性は全く異なるでしょう。 – Owen
@オウェン:わかった。問題のポイントは特に '.toMultiMap'を行うことではなく、Scalaコレクションに汎用的なutilを書く方法です。あなたが想像できるのは、 'List's私は' Map [A、List [B]] 'を返して、' Seq'sのために 'Map [A、Seq [B]]' – pathikrit