我在下面定义了一张地图。键表示UserID,值表示AddressId。
val m: Map[Int, List[Int]]
我想知道反向地图,这意味着我希望每个List中的每个项目都成为一个键,值是一个键列表。
所以基本上每个AddressID都有一个UserID列表。
我该怎么做?
我知道我可以使用mapValues但我需要以某种方式返回密钥。
这样做不会创建列表:
m.map(k => (k._2, k._1))
思想?
答案 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 } }
不是最优雅的方法,但似乎在我这边工作。