2016-08-03 12 views
1

мне нужно обратить картуReverse карты типа [Int, Seq [Int]]

customerIdToAccountIds:Map[Int, Seq[Int]] 

таким образом, что каждый идентификатор учетной записи является ключом к списку всех идентификаторов клиентов учета (многий -to-many):

accountIdToCustomerIds:Map[Int, Seq[Int]] 

Что такое хороший идиоматический способ достичь этого? Благодаря!

Вход:

val customerIdToAccountIds:Map[Int, Seq[Int]] = Map(1 -> Seq(5,6,7), 2 -> Seq(5,6,7), 3 -> Seq(5,7,8)) 
val accountIdToCustomerIds:Map[Int, Seq[Int]] = ??? 

1 -> Seq(5,6,7) 
2 -> Seq(5,6,7) 
3 -> Seq(5,7,8) 

Выход:

5 -> Seq(1,2,3) 
6 -> Seq(1,2) 
7 -> Seq(1,2,3) 
8 -> Seq(3) 

ответ

1
val customerIdToAccountIds = Map(1 -> Seq(5, 6, 7), 2 -> Seq(5, 6, 7), 3 -> Seq(5, 7, 8)) 

    val accountIdToCustomerIds = customerIdToAccountIds.toSeq.flatMap { 
    case (customerId, accountIds) => accountIds.map { accountId => (customerId, accountId) } // swap 
    }.groupBy(_._2).mapValues(_.map(_._1)) // groupBy accountId and extract customerId from tuples 
+0

Почему downvotes? –

+0

Вы и jwvh дали отличные, очень похожие ответы, и я выбрал ваш, потому что я чувствовал, что его легче поддерживать. Спасибо за помощь! – user455497

3
val m = Map(1 -> Seq(5,6,7) 
      , 2 -> Seq(5,6,7) 
      , 3 -> Seq(5,7,8)) 

// Map inverter: from (k -> List(vs)) to (v -> List(ks)) 
m flatten {case(k, vs) => vs.map((_, k))} groupBy (_._1) mapValues {_.map(_._2)} 

//result: Map(8 -> List(3), 5 -> List(1, 2, 3), 7 -> List(1, 2, 3), 6 -> List(1, 2)) 
Смежные вопросы