Scala 反转贴图,但将值用作键,并将键用作值

Scala 反转贴图,但将值用作键,并将键用作值,scala,Scala,我有一张下面定义的地图。键表示用户ID,值表示和地址ID val m: Map[Int, List[Int]] 我想知道反向映射,这意味着对于每个列表中的每个项目,我想使其成为一个键,并且值是一个键列表 所以基本上,对于每个AddressID,我都会有一个用户ID列表 我该怎么做 我知道我可以使用mapValues,但我需要以某种方式返回到键 这样做不会创建列表: m.map(k => (k._2, k._1)) 想法?这里有一个潜在的解决方案: val m = Map( 1 ->

我有一张下面定义的地图。键表示用户ID,值表示和地址ID

val m: Map[Int, List[Int]]
我想知道反向映射,这意味着对于每个列表中的每个项目,我想使其成为一个键,并且值是一个键列表

所以基本上,对于每个AddressID,我都会有一个用户ID列表

我该怎么做

我知道我可以使用mapValues,但我需要以某种方式返回到键

这样做不会创建列表:

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

想法?

这里有一个潜在的解决方案:

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  } }

这不是最优雅的方法,但对我来说似乎很有效。

这里有一个潜在的解决方案:

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  } }
这不是最优雅的方法,但对我来说似乎很有效。

常规Scala

m
    .toVector
    .flatMap   { case (k, vs) => vs.map(_ -> k) }
    .groupBy   { case (v, _) => v }
    .mapValues { _.map { case (_, k) => k } }
如果您使用的是Cat或Scalaz:

正阶

m
    .toVector
    .flatMap   { case (k, vs) => vs.map(_ -> k) }
    .groupBy   { case (v, _) => v }
    .mapValues { _.map { case (_, k) => k } }
如果您使用的是Cat或Scalaz:


如果我有一个Map[Long,Set[Long]],这会改变事情吗?@coolbreeze常规的Scala解决方案仍然有效-在
向量上
flatMap
之后,你仍然会得到
向量[(Long,Long)]
,但结果是
Map[Int,List[Int]
,因此您需要一个
。在
mapValues
中设置
。Scalaz/cats,IIRC,不允许在
集上设置foldMap
,至少如果我有一个Map[Long,Set[Long]]这会改变情况吗?@coolbreeze常规Scala解决方案仍然有效-在
向量上
flatMap
之后,您仍然会得到
向量[(长,长)]
,但结果将是
Map[Int,List[Int]
,因此您需要一个
.toSet
映射值中设置
。Scalaz/cats,IIRC,不允许在
集上设置foldMap,至少在没有额外依赖项的情况下