首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Seq[Seq[String,String]]转换为Map[String,Seq[String]]

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

Stack Overflow用户
提问于 2018-05-06 15:43:13
回答 1查看 645关注 0票数 1

我需要转换这个结构

代码语言:javascript
复制
val seq = Seq(Seq("a","aa"), Seq("b","bb"), Seq("a", "a2"), Seq("b","b2") )

在此地图上:

代码语言:javascript
复制
val map2 = Map ( "a" -> Seq("aa","a2"), "b" -> Seq("bb","b2") )

不能使用toMap,因为它只使用Tuple2作为输入。有什么办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-06 15:47:38

您可以首先按每个分节的第一项分组,然后映射所产生的分组值,以便只保留子序列的第二个元素:

代码语言:javascript
复制
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))

返回:

代码语言:javascript
复制
Map(b -> List(bb, b2), a -> List(aa, a2))

类似的:不使用_(0)_(1),您也可以使用.groupBy(_.head).mapValues(_.map(_.last))

通过这种方式可以使mapValues部件变得更加明确:

代码语言:javascript
复制
.mapValues{
  case valueLists => // List(List(b, bb), List(b, b2))
    valueLists.map{
      case List(k, v) => v // List(b, bb) => bb
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50201552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档