【问题标题】:Elegant way from map to csv scala (flatten a map)从地图到 csv scala 的优雅方式(展平地图)
【发布时间】:2019-04-01 19:16:48
【问题描述】:

我有一张像这样的地图:

val m1 = Map(IND1 -> List((IND1,List((AA,11), (BB,12)))), 
  IND2  ->List((IND1,List((AA,42), (BB,80)))))

结果格式为:

List((IND1,11,12),(IND2,42,80))

我尝试在值上使用flatMap,但它不起作用,我可以让它工作的唯一方法是:

m1.mapValues(x => x.head._2).map(x =>(x._1,x._2(0)._2,x._2(1)._2))

这为我提供了正确的格式,但我知道必须有更好、更优雅的方式。请帮忙

【问题讨论】:

    标签: scala dictionary flatmap


    【解决方案1】:

    您可以对Map 的值使用模式匹配/解构,如下所示,

    val m1 = Map(
      "IND1" -> List(
        ("IND1", List(("AA", 11), ("BB", 12)))
        //(k,    (first        :: second  :: Nil)
      ),
      "IND2" -> List(
        ("IND1", List(("AA", 42), ("BB", 80)))
        //(k,    (first        :: second  :: Nil)
      )
    )
    
    val results = m1.map {
      case (key, ((k, (f :: s :: Nil)) :: Nil)) =>
        (key, f._2, s._2)
    }
    
    println(results) // List((IND1,11,12), (IND2,42,80))
    

    你可以进一步解构fs以及元组,

    val results = m1.map {
      case (key, (_, (_, first) :: (_, second) :: Nil) :: Nil) =>
        (key, first, second)
    }
    

    【讨论】:

      【解决方案2】:
      for {
          (k, valuesList)   <- m1
          (_, values)       <- valuesList
          v1::v2::Nil = values.map(_._2)
      } yield (k, v1, v2)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-25
        • 2020-07-06
        • 2015-04-18
        • 2015-11-28
        • 1970-01-01
        • 2011-09-08
        • 1970-01-01
        • 2016-09-25
        相关资源
        最近更新 更多