2016-08-26 203 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

相关问题