2016-11-07 3 views
0

Я новичок в Scala, мне нужно преобразовать List[List[(String, Int)]] в List[(String, Int, Int)]:Преобразование списка [Список [объекты]] в список [Object] в Скале

Мой первоначальный список содержит, например, [(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

Вы уверены, что ваш 'List [Список [Model]]' всегда будет содержать ровно 2 списка? –

+0

Нет Jasper, это противоречит 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 процентов последовательной) вопрос. Я думаю, что вы ищете карту [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)