2016-08-03 37 views
1

我需要反轉地圖反向映射的類型的[中等,序號[INT]]

customerIdToAccountIds:Map[Int, Seq[Int]] 

,使得每個帳戶ID是該帳戶的所有顧客ID的列表的鍵(許多一對多的關係):

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