【问题标题】:Scala reverse a map and new value is a list for duplicated key [duplicate]Scala反转地图,新值是重复键的列表[重复]
【发布时间】:2018-09-08 04:37:14
【问题描述】:

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

例如

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

所以地图的结果是

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

【问题讨论】:

  • @jwvh 当您说“特别好的答案”时,您的意思是“我给出的答案”,对吧?肯定有比那个更好的答案...

标签: scala


【解决方案1】:

您可以使用 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))

如果您在有一个元素时不需要 List(如您的示例中)

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

【讨论】:

    【解决方案2】:

    groupBy 值并将值映射到键列表:

    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 映射,然后用新键分组,

    scala> map.map {case (k, v) => List(v -> k) }
              .groupBy { case List((a, b)) => a}
              .map { case (k, v) => k -> v.flatten.map(_._2) }
    res1: scala.collection.immutable.Map[Int,scala.collection.immutable.Iterable[Int]] = HashMap(111 -> List(1, 3), 222 -> List(2))
    

    【讨论】:

      猜你喜欢
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多