我有一个以下的Scala映射,我想反转该映射,对于重复的新键,该值将附加到列表中。
例如
val map = Map(1 -> 111, 2 -> 222, 3 -> 111)
所以地图的结果是
Map(111 -> List(1,3), 222 -> 2)
答案 0 :(得分:3)
您可以使用groupBy和mapValues
val map = Map(1 -> 111, 2 -> 222, 3 -> 111)
val result = map.groupBy { case (key, value) => value }.mapValues(_.keys.toList)
println(result)
// Map(222 -> List(2), 111 -> List(1, 3))
如果在一个元素(例如您的示例)中不想要列表,则
val result2 = map.groupBy { case (_, value) => value }.mapValues(_.keys.toList match {
case x :: Nil => x
case xs => xs
})
println(result2)
// Map(222 -> 2, 111 -> List(1, 3))
答案 1 :(得分:0)
groupBy值和将值映射到键列表:
http://www.example.com/?rest_route=/wp/v2/posts/&categories=60,61
或者,scala> val map = Map(1 -> 111, 2 -> 222, 3 -> 111)
map: scala.collection.immutable.Map[Int,Int] = Map(1 -> 111, 2 -> 222, 3 -> 111)
scala> map.groupBy(_._2).map{case (k, v) => k -> v.keys.toList}
res0: scala.collection.immutable.Map[Int,List[Int]] = HashMap(111 -> List(1, 3), 222 -> List(2))
首先使用reverse
,然后按新密钥分组
value -> key