Scala:编写不同类型的Span函数

时间:2017-04-14 19:20:43

标签: scala

我想编写一个与span函数类似的scala函数,但有一个小技巧:它返回第一个列表,其中包含所有递增的整数,其余整数则返回第二个列表,如下所示:

newSpan(List(2, 3, -1, 4, 7))
//> res1: (List[Int], List[Int]) = (List(2, 3),List(-1, 4, 7))

我想做一些像这样简单的事情:

l.span(x=> x < ?)

问题在于我不知道如何确定下一个数字是否会高于之前的数字。

有人可以给我一个暗示吗?

4 个答案:

答案 0 :(得分:2)

val a = List(2,3,4,-5,4,5)
a.span(i=> a.sliding(2).takeWhile(l=> l.head<l.last).flatten.contains(i))

答案 1 :(得分:1)

你可以使用以下元素分组(使用zip)elems

l.zip(l.drop(1)).filter { case(el1, el2) => el2 > el1 }

我认为这可能是一个很好的起点。现在您可能需要.takeWhile来获取前缀或类似内容

对不起,我没有给你一个确切的解决方案,但我还没有完全理解你想要的东西

  

注意:List.span在http://www.scala-lang.org/api/2.7.1/scala/List.html#span%28%28A%29%3D%3EBoolean%29

定义

答案 2 :(得分:1)

一个选项:

(0 until l.length).takeWhile(i => i == 0 || l(i-1) < l(i)).map(l)
// res37: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 3)

如果你想要一个元组:

((0 until l.length).toList.
    span(i => i == 0 || l(i-1) < l(i))
    match { case (x, y) => (x.map(l), y.map(l)) })
// res61: (List[Int], List[Int]) = (List(2, 3),List(-1, 4, 7))

答案 3 :(得分:0)

提示:使用enumerateQueueExample()然后您可以使用sliding(2)

相关问题