编辑:我意识到这里描述的行为是滑动的预期行为;我在质疑为什么会这样。
编辑2:这个问题的重复
我在 scala 集合上使用了滑动功能,我对以下情况下的行为感到惊讶:
m.sliding(N)
其中 M 是 m.size,并且 M < N。
在这种情况下,您不会返回一个空迭代器,而是返回一个单元素迭代器,其中唯一的元素是输入:
scala> List( ).sliding( 2 ).size
res0: Int = 0
scala> List( 1 ).sliding( 2 ).size
res1: Int = 1
例如,这是一个简单的函数,可以从 Pascal 三角形递归计算一行:
def row( num : Int ) : List[ Int ] =
{
num match
{
case 0 => List( 1 )
case x : Int => List( 1 ) ++ row( x - 1 ).sliding( 2 ).map( _.sum ) :+ 1
}
}
但这并不像预期的那样,因为上面讨论的行为:
scala> row( 1 )
res0: List[Int] = List(1, 1, 1)
相反,我们必须包含一个额外的特殊情况:
def row2( num : Int ) : List[ Int ] =
{
num match
{
case 0 => List( 1 )
case 1 => List( 1, 1 )
case x : Int => List( 1 ) ++ row2( x - 1 ).sliding( 2 ).map( _.sum ) :+ 1
}
}
这现在按预期工作。
有谁知道为什么滑动会这样?我要求一定长度的子集合对我来说似乎很奇怪,而在此处讨论的情况下,您会得到一个不同长度的集合!