首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在scala中将列表[LIst[objects]]转换为List[Object]

在scala中将列表[LIst[objects]]转换为List[Object]
EN

Stack Overflow用户
提问于 2016-11-07 12:45:21
回答 3查看 279关注 0票数 0

我是Scala的新手,我需要将List[List[(String, Int)]]转换成List[(String, Int, Int)]

例如,我的原始列表包含[(x, 20), (y,20)], [(x, 30), (y,40)]。结果应该是[(x , 20, 30), (y, 20, 40)],即元组列表。

我尝试了以下代码:

代码语言:javascript
运行
复制
data.reduce {(object1, object2) =>
val newObject = object2.find(matter => matter.key == object1.key)
new model(object1.x, object1.value, newObject.value)
} 

但是它抛出了一个错误,这个错误不得不返回相同的类型。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-07 13:05:43

我假设您希望结果具有List[(String, Int, Int)]类型,这意味着您假定每个"key“(字母,例如x)都有两个匹配的元组(否则,结果列表中可能有不是3元组的项)。

如果是这样的话:

代码语言:javascript
运行
复制
val data = List(List(("x", 20), ("y",20)), List(("x", 30), ("y",40)))

val result: List[(String, Int, Int)] = data
  .flatten // flatten to get a list of tuples
  .groupBy(_._1) // group by tuple's first element
  .mapValues(_.map(_._2)) // get rid of "key" in value list
  .map { case (k, List(i1, i2)) => (k, i1, i2) }.toList // ASSUMEs each key has exactly two entries, creates 3-Tuples

println(result) // List((y,20,40), (x,20,30)) 

否则-如果结果中的元组不能保证所有元素都有相同数量的元素(即并非所有的“键”都有两个“值”),那么我强烈建议使用Lists,通过以下方法实现:

代码语言:javascript
运行
复制
val data = List(List(("x", 20), ("y",20)), List(("x", 30), ("y",40)), List(("x", 50)))

val result: List[List[Any]] = data
  .flatten // flatten to get a list of tuples
  .groupBy(_._1) // group by tuple's first element
  .map { case (k, l) => k :: l.map(_._2) }.toList // prepend key to list of values


println(result) // List(List(y, 20, 40), List(x, 20, 30, 50))
票数 1
EN

Stack Overflow用户

发布于 2016-11-07 14:17:02

对于你的问题(不是百分之百的一致),这不是一个确切的答案。我认为您正在寻找一个Map[String,ListInt]。

代码语言:javascript
运行
复制
val res = data.flatten.distinct.groupBy(_._1).map(a => a._1 -> a._2.map(_._2))

println(res)  // Map(y -> List(20, 40), x -> List(20, 30))
票数 0
EN

Stack Overflow用户

发布于 2016-11-07 15:38:01

代码语言:javascript
运行
复制
val ls1 = List(('x', 20), ('y',20))
val ls2 = List(('x', 30), ('y',40))
val ls = List(ls1,ls2)

println(ls.flatMap(x => x).groupBy(x => x._1).map{case(x,y) => (x,y.map(z => z._2)) }.toList)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40465543

复制
相关文章

相似问题

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