2015-09-10 77 views

回答

2

這就是:

scala> val m = Map("uniquePersonId1" -> List("subaru", "honda"), 
        "uniquePersonId2" -> List("honda", "toyota")) 

scala> m flatten { case(k, vs) => vs map ((_, k)) } groupBy (_._1) mapValues { _ map (_._2) } 
res1: scala.collection.immutable.Map[String,scala.collection.immutable.Iterable[String]] = 
    Map(subaru -> List(uniquePersonId1), 
     toyota -> List(uniquePersonId2), 
     honda -> List(uniquePersonId1, uniquePersonId2)) 

而且隨着fold另一種解決方案:

m.foldLeft(Map[String, List[String]]().withDefaultValue(Nil)) { 
    case(r, (k, vs)) => vs.foldLeft(r){ (u, v) => u.updated(v, k::u(v)) } 
} 
+0

太棒了!謝謝! – test123

0

我能夠得到它通過以下方式進行:

var maps = Map("uniquePersonId1" -> List("subaru", "honda"), 
"uniquePersonId2" -> List("honda", "toyota")) 

class CarToId(c:String, i:String) { 
    var car:String = c 
    var id:String = i 
} 

var mapping = maps.flatMap(p => p._2.map(i => new CarToId(i, p._1))) 
var result = mapping.groupBy(i => i.car).mapValues(c => c.map(y => y.id)) 

如果你們碰巧知道一個更好的方式做,請讓我知道。

+1

你可以只使用'case class CarToId(car:String,id:String)' - 不需要額外的成員變量 – millhouse

0

只要設法提供另一個看似明確的方式,而不進口額外的類

val originalMap = 
    Map(
     "uniquePersonId1" -> List("subaru", "honda"), 
     "uniquePersonId2" -> List("honda", "toyota") 
    ) 

// k1 -> List(A, B) change to List(A -> k1, B -> k1) 
val intermediateList = originalMap.map { 
    case (key, strList) => strList.map(_ -> key) 
}.toList.flatten 

/* 
    intermediateList: List[(String, String)] = List((subaru,uniquePersonId1), (honda,uniquePersonId1), (honda,uniquePersonId2), (toyota,uniquePersonId2)) 
*/ 
val finalResult = intermediateList.foldLeft(Map[String, List[String]]())({ 
    case (acc, (k1, v1)) => { 
     // if the key already exists, replace the value with new one 
     acc + { 
      k1 -> { 
       acc.find(_._1 == k1).map { matched => 
        v1 :: matched._2 
       }.getOrElse { 
        (v1 :: Nil) 
       } 
      } 
     } 
    } 
}) 

// Map(subaru -> List(uniquePersonId1), honda -> List(uniquePersonId2, uniquePersonId1), toyota -> List(uniquePersonId2)) 
println(finalResult)