takeWhile:还需要第一个元素在scala中失败的条件

时间:2014-11-09 12:31:48

标签: scala

scala> List(1,2,3,4,5,6,7).takeWhile(i=>i<5) 
res1: List[Int] = List(1, 2, 3, 4)

如果我还需要在结果中包含5,该怎么办?

3 个答案:

答案 0 :(得分:3)

假设您将使用的功能比前5个元素更复杂,

你可以做到

scala> List(1,2,3,4,5,6,7)
res5: List[Int] = List(1, 2, 3, 4, 5, 6, 7)

scala> res5.takeWhile(_<5) ++ res5.dropWhile(_<5).take(1)
res7: List[Int] = List(1, 2, 3, 4, 5)

另外

scala> res5.span(_<5)
res8: (List[Int], List[Int]) = (List(1, 2, 3, 4),List(5, 6, 7))
scala> res8._1 ++ res8._2.take(1)
res10: List[Int] = List(1, 2, 3, 4, 5)

另外

scala> res5.take(res5.segmentLength(_<5, 0) + 1)
res17: List[Int] = List(1, 2, 3, 4, 5)

scala> res5.take(res5.indexWhere(_>5))
res18: List[Int] = List(1, 2, 3, 4, 5)

答案 1 :(得分:1)

修改

如果这不是并行计算,并且您不会使用并行集合:

var last = myList.head
val rem = myList.takeWhile{ x=>
  last = x
  x < 5
}

last :: rem

匿名函数围绕您想要的解决方案形成一个闭包。

上一个答案

我很满足于那么复杂的事情:

.takeWhile(_ <= 5)

其中您只使用小于或等于运算符。

答案 2 :(得分:-1)

列表(1,2,3,4,5,6,7,8).takeWhile(_&lt; = 5)

这是最好的解决方案