2016-11-07 80 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)