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

时间:2016-11-07 12:45:22

标签: scala

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

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

我尝试了以下代码:

data.reduce {(object1, object2) =>
val newObject = object2.find(matter => matter.key == object1.key)
new model(object1.x, object1.value, newObject.value)
} 

但它会抛出一个错误,即reduce必须返回相同的类型。

3 个答案:

答案 0 :(得分:1)

我假设您希望结果具有类型List[(String, Int, Int)],这意味着您假设每个“键”(字母,例如x完全两个匹配元组(否则生成的List可能包含不是3元组的项)。

如果是这样的话:

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)) 

否则 - 如果结果中的元组不能保证全部具有相同数量的元素(即并非所有“键”都具有正好两个“值”),那么我强烈建议留在{{ 1}},你将通过以下方式实现:

Lists

答案 1 :(得分:0)

这不是您(不是100%一致)问题的准确答案。 我想你正在寻找Map [String,List [Int]]。

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))

答案 2 :(得分:0)

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)