2013-07-25 1 views
6

Как это отображение списка,Как транспонировать карту со значениями списка в Scala

Map (
    "a" -> List(1, 2) 
) 

быть перенесены в этот список карт в основном с использованием методов из библиотек Scala?

List(
    Map("a" -> 1), 
    Map("a" -> 2) 
) 

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

Этот второй пример иллюстрирует требуемое преобразование с картой с более чем одной записью.

Отсюда

Map (
    10 -> List("10a", "10b", "10c"), 
    29 -> List("29a", "29b", "29c") 
) 

этому

List(
    Map(
    10 -> "10a", 
    29 -> "29a"), 
    Map(
    10 -> "10b", 
    29 -> "29b"), 
    Map(
    10 -> "10c", 
    29 -> "29c") 
) 

Можно предположить, что все значения являются списки одного и того же размера.

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

Map (
    "a" -> List() 
) 

должно привести к List().

+2

Это больше * транспонированная *, чем * Сглаживание * –

+0

Обновлено использовать транспонирование. –

ответ

9
val m = Map (
    10 -> List("10a", "10b", "10c"), 
    29 -> List("29a", "29b", "29c") 
) 

m.map{ case (k, vs) => 
    vs.map(k -> _) 
}.toList.transpose.map(_.toMap) 

Обратите внимание, что это также обрабатывает ваш «пустой список» случай

+0

Это соответствует моим требованиям и проходит все мои модульные тесты. –

Смежные вопросы