2016-08-26 248 views
2

鑑於List[List[Any]],我怎樣才能將它減少到List[Any]將包含每個子列表的第n個元素? 讓我用一個例子來解釋它。這是最初的名單:從列表的子列表中提取第n個元素並將它們合併到一個新列表中?

List(List(1,2,3,44),List(2,3,4,55)) 

我想,以獲得從List(1,2,3,44)List(2,3,4,55)提取4個要素:

List(44,55) 

i將應使用reduce,或者我應該結合mapflatten什麼?任何提示都會非常有用。

回答

2

將每個子列表提升到部分函數,​​其中未定義的列表位置映射到None,並將位置定義爲Some(listValue),並使用flatMap變平到一個列表,

xs.flatMap(_.lift(3)) 
res1: List[Int] = List(44, 55) 

xs.flatMap(_.lift(4)) 
res2: List[Int] = List() 
+0

如果結果列表中的一個總是包含1個元素,例如列表(1),如何將其安全地還原爲單個值?我想'xs.flatMap(_。lift(4))。head(0)'不安全 – Lobsterrrr

+0

使用'headOption',例如' 'xs.flatMap(_。lift(4))。headOption'提供'None'。 – elm

0

你試過了什麼?

喜歡的東西

val ll = List(List(1,2,3,44),List(2,3,4,55)) 
ll.map(_.apply(3)) 

只是工作。

只要你提取單個元素,你的結果已經變平。

+0

我試圖像'll.get.head許多不同的組合(3)'這隻需第一子列表,或者'll.map。(_._ 4)'無法編譯等,我不知道「應用」功能。 – Lobsterrrr

+0

'list.apply(n)'=='list(n)'=='返回第n個元素,或者拋出java.lang.IndexOutOfBoundsException。您也可以使用'list.lift(n)'來獲得'Option'並避免異常。 – dveim

+0

'lift'的使用似乎是一個更安全的解決方案。謝謝。 – Lobsterrrr

0

你可以這樣做:

list.map(_(3)) 

但這是不太安全的:如果你的子表沒有足夠的元素,你會得到IndexOutOfBoundsException異常

更安全的解決方案是:

list.flatten(_.lift(3)) 
+0

這項工作是否有任何數量的子列表? – Lobsterrrr

相關問題