反转地图但使用值作为键,键作为值

时间:2017-01-12 18:53:37

标签: scala

我在下面定义了一张地图。键表示UserID,值表示AddressId。

val m: Map[Int, List[Int]]

我想知道反向地图,这意味着我希望每个List中的每个项目都成为一个键,值是一个键列表。

所以基本上每个AddressID都有一个UserID列表。

我该怎么做?

我知道我可以使用mapValues但我需要以某种方式返回密钥。

这样做不会创建列表:

m.map(k => (k._2, k._1))

思想?

2 个答案:

答案 0 :(得分:2)

常规Scala

m
    .toVector
    .flatMap   { case (k, vs) => vs.map(_ -> k) }
    .groupBy   { case (v, _) => v }
    .mapValues { _.map { case (_, k) => k } }

如果你正在使用 Scalaz

m.toVector foldMap { case (k, vs) => vs foldMap (v => Map(v -> List(k)))  }

答案 1 :(得分:0)

这是一个潜在的解决方案:

val m = Map( 1 -> List("a","b"), 2 -> List("c","a" ))

val m1 = m.toList.flatMap{ case(key,valueList) => valueList.map(value => (value,key) )}.groupBy{ _._1  } 

m1.map{ case(key,valueList) => key -> valueList.map{case (x,y) => y  } }

不是最优雅的方法,但似乎在我这边工作。