Я предполагаю, что вы хотите, чтобы результат имеет тип 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))
Вы уверены, что ваш 'List [Список [Model]]' всегда будет содержать ровно 2 списка? –
Нет Jasper, это противоречит n элементам. – kittu
'[(x, 20), (y, 20)]' не является 'List [List [Tuple2]]', это 'List [Tuple2]' –