Scala反向映射,新值是重复键的列表

时间:2018-09-08 04:37:14

标签: scala

我有一个以下的Scala映射,我想反转该映射,对于重复的新键,该值将附加到列表中。

例如

val map = Map(1 -> 111, 2 -> 222, 3 -> 111)

所以地图的结果是

Map(111 -> List(1,3), 222 -> 2)

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