我需要转换此结构
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作为输入。任何想法如何处理这个?
答案 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
}
}