将Seq [Seq [String,String]]转换为Map [String,Seq [String]]

时间:2018-05-06 15:43:13

标签: scala

我需要转换此结构

val seq = Seq(Seq("a","aa"), Seq("b","bb"), Seq("a", "a2"), Seq("b","b2") )

到这张地图:

val map2 = Map ( "a" -> Seq("aa","a2"), "b" -> Seq("bb","b2") )

无法使用toMap,因为它仅适用于Tuple2作为输入。任何想法如何处理这个?

1 个答案:

答案 0 :(得分:2)

您可以先按每个子序列的第一项进行分组,然后将得到的分组值映射到仅保留子序列的第二个元素:

Seq(Seq("a","aa"), Seq("b","bb"), Seq("a", "a2"), Seq("b","b2") )
  .groupBy(_(0)) // Map(b -> List(List(b, bb), List(b, b2)), a -> List(List(a, aa), List(a, a2)))
  .mapValues(_.map(_(1))) // Map(b -> List(bb, b2), a -> List(aa, a2))

返回:

Map(b -> List(bb, b2), a -> List(aa, a2))

类似:您也可以使用_(0)

而不是_(1).groupBy(_.head).mapValues(_.map(_.last))

mapValues部分可以通过这种方式更加明确:

.mapValues{
  case valueLists => // List(List(b, bb), List(b, b2))
    valueLists.map{
      case List(k, v) => v // List(b, bb) => bb
    }
}