2017-11-15 1 views
3

나는 [String, List [String]] Map을 가지고 있으며 그것을 반전시키고 싶습니다. 예를 들어, 나는 결과가 있어야한다스칼라에서지도 반전 (문자열 -> 목록)

"1" -> List("a","b","c") 
    "2" -> List("a","j","k") 
    "3" -> List("a","c") 

같은이있는 경우

"a" -> List("1","2","3") 
    "b" -> List("1") 
    "c" -> List("1","3") 
    "j" -> List("2") 
    "k" -> List("2") 

나는이 시도했다 :]

m.map(_.swap) 

하지만이 맵 [목록 [문자열을 반환 문자열] :

List("a","b","c") -> "1" 
    List("a","j","k") -> "2" 
    List("a","c") -> "3" 

답변

5

지도 반전은 약간 m 광석이 복잡하다.

val m = Map("1" -> List("a","b","c") 
      ,"2" -> List("a","j","k") 
      ,"3" -> List("a","c")) 

m flatten {case(k, vs) => vs.map((_, k))} groupBy (_._1) mapValues {_.map(_._2)} 
//res0: Map[String,Iterable[String]] = Map(j -> List(2), a -> List(1, 2, 3), b -> List(1), c -> List(1, 3), k -> List(2)) 

튜플의 모음으로 Map을 병합합니다. groupBy은 이전 값을 새 키로 사용하여 새 Map을 만듭니다. 그런 다음 키 (이전 값) 요소를 제거하여 값의 조합을 해제합니다.