从地图到 csv scala 的优雅方式(展平地图)
Elegant way from map to csv scala (flatten a map)
我有一张看起来像这样的地图:
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))
这给了我正确的格式,但我知道一定有更好更优雅的方式。请帮助
您可以对 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))
你可以更进一步解构f
和s
以及元组,
val results = m1.map {
case (key, (_, (_, first) :: (_, second) :: Nil) :: Nil) =>
(key, first, second)
}
for {
(k, valuesList) <- m1
(_, values) <- valuesList
v1::v2::Nil = values.map(_._2)
} yield (k, v1, v2)
我有一张看起来像这样的地图:
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))
这给了我正确的格式,但我知道一定有更好更优雅的方式。请帮助
您可以对 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))
你可以更进一步解构f
和s
以及元组,
val results = m1.map {
case (key, (_, (_, first) :: (_, second) :: Nil) :: Nil) =>
(key, first, second)
}
for {
(k, valuesList) <- m1
(_, values) <- valuesList
v1::v2::Nil = values.map(_._2)
} yield (k, v1, v2)