2016-11-07 85 views
0

我是新来斯卡拉,我需要转换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) 
} 

但扔减少必须返回相同类型的错误。

+0

您确定您的'名单[列表[产品型号]'总是恰好包含2只列出了? –

+0

没有贾斯珀它contails n没有项目。 – kittu

+1

'[(x,20),(y,20)]'不是'List [List [Tuple2]]',它是一个'List [Tuple2]' –

回答

1

我假设你想要的结果有型List[(String, Int, Int)],这意味着你承担各自的“钥匙”(字母,如x)具有正好两个匹配的元组(否则由此产生的名单可能是项目不是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)) 

否则 - 如果在结果中的元组不能保证所有具有相同数量的元素(即不是所有的“钥匙”将会有确切的两个“值” ),那么我强烈建议留Lists,您可以通过以下方式实现:

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