我是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必须返回相同的类型。
答案 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)