Элегантный путь от карты до CSV Scala (сгладить карту) - PullRequest
0 голосов
/ 28 октября 2018

У меня есть карта, которая выглядит так:

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

Это дает мне правильный формат, но я знаю, что должен быть лучший и более элегантный способ. Пожалуйста, помогите

Ответы [ 2 ]

0 голосов
/ 29 октября 2018
for {
    (k, valuesList)   <- m1
    (_, values)       <- valuesList
    v1::v2::Nil = values.map(_._2)
} yield (k, v1, v2)
0 голосов
/ 28 октября 2018

Вы можете использовать сопоставление с образцом / деконструкцию при значении 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)
}
...