Ich habe eine Seq[(A, B)]
. Ich wollte eine implizite Methode zu solchen Sammlungen hinzufügen, so dass ich .toMultiMap
tun kann, um eine Map[A, Seq[B]]
zurück zu bekommen.Generisch erweiternden Scala Kollektionen
Dies war mein erster Versuch:
implicit class PairsExtensions[A, B](t: Traversable[(A, B)]) {
def toMultiMap: Map[A, Traversable[B]] = t.groupBy(_._1).mapValues(_.map(_._2))
}
Aber jetzt das Problem ist, ich für die Werte ein Traversable
wieder immer. Ich möchte ein Map[A, Set[B]]
zurückbekommen, wenn ich Set[(A, B)].toMultiMap
mache. So
, dann habe ich versucht, so etwas wie diese:
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))
}
Aber es funktioniert nicht:
val m1: Map[Int, Set[String]] = Set.empty[(Int, String)]
val m2: Map[Int, List[String]] = List.empty[(Int, String)]
Was ist die Art und Weise, dies zu tun?
@ m-ZL Sorry, klar zu sein, der erste Versuch, kompiliert und arbeitet. Zweites Snippet kompiliert nicht. Ich habe gerade meinen Versuch gepostet. – pathikrit
Nur meine 2 Cent: Sie sollten vielleicht noch einmal darüber nachdenken, ob es wirklich sinnvoll ist, '.toMultiMap' auf einem' Set' zu verwenden, um Ihnen eine 'Map [A, Set [B]' zu geben. Die Einzigartigkeit der früheren und der späteren Sammlungen wird sich deutlich unterscheiden. – Owen
@Owen: Ich verstehe. Es geht nicht darum, '.toMultiMap' zu erstellen, sondern generische Utils für Scala-Sammlungen zu schreiben. Sie können sich vorstellen, für 'List's will ich' Map [A, List [B]] 'zurück und für' Seq's will ich 'Map [A, Seq [B]]' – pathikrit