Je suis venu ici à la recherche d'un moyen d'inverser une Carte de type Carte[A, Seq[B]] Carte[B, Seq[A]], où chaque B dans la nouvelle carte est associée à chaque Un dans la vieille carte pour lesquelles le B est l'Un des associés de la séquence.
E. g.,
Map(1 -> Seq("a", "b"), 2-> Seq("b", "c"))
inverserait à
Map("a" -> Seq(1), "b" -> Seq(1, 2), "c" -> Seq(2))
Voici ma solution :
val newMap = oldMap.foldLeft(Map[B, Seq[A]]().withDefaultValue(Seq())) {
case (m, (a, bs)) => bs.foldLeft(m)((map, b) => map.updated(b, m(b) :+ a))
}
où oldMap est de type Map[A, Seq[B]]
et newMap est de type Map[B, Seq[A]]
Le imbriquée foldLefts me font grincer des dents un peu, mais c'est la façon la plus simple que j'ai pu trouver pour accomplir ce type d'inversion. Quelqu'un a une solution plus propre?