Scala集合选择元素,直到第一个元素满足要求为止

Scala集合选择元素,直到第一个元素满足要求为止,scala,Scala,例如,我有下面的Scala列表,我想得到一个子列表,直到有一个需求可以得到满足 val list = Seq(1,2,3,4,5,5,4,1,2,5) 要求数字为5,因此我希望结果为: Seq(1,2,3,4) 目前,我使用Scala集合的索引where和splitAt返回: list.splitAt(list.indexWhere(x => x == 5)) (Seq(1,2,3,4), Seq(5,5,4,1,2,5)) 我不确定是否有更好的方法可以使用我没有意识到的更好的Sc

例如,我有下面的Scala列表,我想得到一个子列表,直到有一个需求可以得到满足

val list = Seq(1,2,3,4,5,5,4,1,2,5)
要求数字为5,因此我希望结果为:

Seq(1,2,3,4)
目前,我使用Scala集合的
索引where
splitAt
返回:

list.splitAt(list.indexWhere(x => x == 5))

(Seq(1,2,3,4), Seq(5,5,4,1,2,5))

我不确定是否有更好的方法可以使用我没有意识到的更好的Scala collection方法实现同样的效果?

您可以使用
takeWhile

scala> val list = Seq(1,2,3,4,5,5,4,1,2,5)
list: Seq[Int] = List(1, 2, 3, 4, 5, 5, 4, 1, 2, 5)

scala> list.takeWhile(_ != 5)
res30: Seq[Int] = List(1, 2, 3, 4)

像这样使用
span

val (l,r) = list.span(_ != 5)
哪一个

l: List(1, 2, 3, 4)
r: List(5, 5, 4, 1, 2, 5)
或者,你可以写

val l = list.span(_ != 5)._1
仅访问结果元组的第一个元素


这会在不包含条件的第一个元素处将列表一分为二。

我不想开玩笑,但您是否尝试阅读文档?当我认为可能有一种标准的方法时,我要做的第一件事就是扫描(在本例中)Seq方法列表,这会很快让你找到
span
takeWhile
takeWhile
的名字在本例中特别具有启发性)。尽管elm的答案是正确的,但我认为Ende的
List#takeWhile
由于简单,应该是公认的答案。由于OP只需要elm's中的
l
,我认为Ende提交的答案更简单。@KevinMeredith,相反,OP的示例输出显示了5之前的列表和列表的其余部分。与您的相反:),OP说
要求的数字是5,因此我希望结果为:'Seq'(1,2,3,4)
“哦,太酷了。takeWhile和dropWhile”的建议是相反的。但我们都在尝试读心术,也许OP会过来告诉我们:)