【问题标题】:Scala: inverting a one-to-many relationship [duplicate]Scala:反转一对多关系[重复]
【发布时间】:2019-04-18 15:06:31
【问题描述】:

我有:

val intsPerChar: List[(Char, List[Int])] = List(
  'A' -> List(1,2,3),
  'B' -> List(2,3)
)

我想得到一个整数与他们有映射关系的字符的映射。即,我想得到:

val charsPerInt: Map[Int, List[Char]] = Map(
  1 -> List('A'),
  2 -> List('A', 'B'),
  3 -> List('A', 'B')
)

目前,我正在做以下事情:

val numbers: List[Int] = l.flatMap(_._2).distinct
numbers.map( n =>
  n -> l.filter(_._2.contains(n)).map(_._1)
).toMap

有没有更不明确的方式来做到这一点?理想情况下是某种groupBy

【问题讨论】:

    标签: scala


    【解决方案1】:

    试试

    intsPerChar
      .flatMap { case (c, ns) => ns.map((_, c)) }
      .groupBy(_._1)
      .mapValues(_.map(_._2))  
    // Map(2 -> List(A, B), 1 -> List(A), 3 -> List(A, B))
    

    【讨论】:

      【解决方案2】:

      您是否认为它更具可读性可能是个人喜好,但以下是另一种选择:

      intsPerChar
        .flatMap(n => n._2.map(i => i -> n._1)) // List((1,A), (2,A), (3,A), (2,B), (3,B))
        .groupBy(_._1) // Map(2 -> List((2,A), (2,B)), 1 -> List((1,A)), 3 -> List((3,A), (3,B)))
        .transform { (_, v) => v.unzip._2} 
      

      最终输出为:

      Map(2 -> List(A, B), 1 -> List(A), 3 -> List(A, B))
      

      【讨论】:

      • 为了记录,我更喜欢 @Dmytro 使用 .mapValues 而不是我的转换/解压缩
      猜你喜欢
      • 1970-01-01
      • 2013-07-26
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多