List 函数检查列表是否没有间隙

List 函数检查列表是否没有间隙,list,function,scala,scala-collections,List,Function,Scala,Scala Collections,我只想要一个返回true的函数,如果列表[Integer]中的所有元素都互相跟随,即 noGaps(List(3,4,5)) // true noGaps(List(4,3,5)) // false noGaps(List(3,4,6)) // false 我有一些有效的方法,但有点冗长——最优雅的解决方案是什么?这个怎么样 def noGaps(xs: Seq[Int]) = xs.size < 2 || xs.sliding(2).forall { case Seq(x, y)

我只想要一个返回
true
的函数,如果
列表[Integer]
中的所有元素都互相跟随,即

noGaps(List(3,4,5)) // true
noGaps(List(4,3,5)) // false
noGaps(List(3,4,6)) // false
我有一些有效的方法,但有点冗长——最优雅的解决方案是什么?

这个怎么样

def noGaps(xs: Seq[Int]) =
  xs.size < 2 || xs.sliding(2).forall { case Seq(x, y) => y == x + 1 }
def noGaps(xs:Seq[Int])=
xs.size<2 | | xs.slideing(2).forall{case Seq(x,y)=>y==x+1}

您可以明确地将
列表与以下内容进行比较:


请注意,虽然很优雅,但由于
l.last
O(n)
,因此该方法的效率略低于。如果
n
是列表的大小,并且
i
是有间隙的第一个元素(或者
n
如果没有间隙),那么滑动解决方案将在
i
步骤中执行,而这一步是在
n+i
步骤中执行的。

我在此将其命名为“滑动规则”:它总是需要两次尝试才能正确执行。首先你做对了。然后,当seq大小小于滑动窗口时,您可以正确地执行此操作……scala标准库对我来说仍然充满了惊喜。直到你指出这个方法,我才知道。这个方法很好。如果没有if语句,它将是:xs.slideing(2).forall{case Seq(x,y)=>y==x+1;case{=>true}
def noGaps(xs: Seq[Int]) = xs.isEmpty||xs.tail == xs.map(_+1).init
def noGaps(l: Seq[Int]): Boolean =
  l.isEmpty || l.sameElements(l.head to l.last)