2015-09-10 36 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)