我想编写一个与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 < ?)
问题在于我不知道如何确定下一个数字是否会高于之前的数字。
有人可以给我一个暗示吗?
答案 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)