例如我有跟随Scala列表,我希望得到一个子列表,直到有一个要求可以满足。
val list = Seq(1,2,3,4,5,5,4,1,2,5)
要求是数字是5,所以我希望结果为:
Seq(1,2,3,4)
目前,我使用Scala集合indexWhere
和splitAt
返回:
list.splitAt(list.indexWhere(x => x == 5))
(Seq(1,2,3,4), Seq(5,5,4,1,2,5))
我不确定有更好的方法可以通过更好的Scala集合方法实现相同的方法吗?
答案 0 :(得分:7)
您可以使用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)
答案 1 :(得分:3)
像这样使用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
仅访问生成的元组的第一个元素。
这会将列表排在第一个不符合条件的元素上。