Scala Map:使用相同的值组合键?

时间:2017-01-12 17:47:52

标签: scala scala-collections

假设我有Map喜欢

val x = Map(1 -> List("a", "b"), 2 -> List("a"), 
            3 -> List("a", "b"), 4 -> List("a"), 
            5 -> List("c"))

我如何从中创建一个新的Map,其中List的密钥来自x具有相同值的密钥,例如,我该如何实现

def someFunction(m: Map[Int, List[String]]): Map[List[Int], List[String]] = 
  // stuff that would turn x into
  // Map(List(1, 3) -> List("a", "b"), List(2, 4) -> List("a"), List(5) -> List("c"))

1 个答案:

答案 0 :(得分:3)

您可以将Map转换为List,然后使用groupBy聚合每个元组的第一个元素:

x.toList.groupBy(_._2).mapValues(_.map(_._1)).map{ case (x, y) => (y, x) }

// res37: scala.collection.immutable.Map[List[Int],List[String]] = 
//        Map(List(2, 4) -> List(a), List(1, 3) -> List(a, b), List(5) -> List(c))

或者@Dylan评论说,使用_.swap切换元组'元素:

x.toList.groupBy(_._2).mapValues(_.map(_._1)).map(_.swap)