可能重复:
Inconsistent behaviour for xs.sliding(n) if n is less than size?
编辑:我意识到这里描述的行为是预期的滑动行为;我在质疑为什么会这样。
编辑2:重复this question
我在scala集合上使用滑动函数,我对以下情况中的行为感到惊讶:
m.sliding(N)
其中M是m.size,M< Ñ
在这种情况下,你没有得到一个空的迭代器,你得到一个单元素迭代器,其中唯一的元素是输入:
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
}
}
现在按预期工作。
有谁知道为什么滑动会像这样?我觉得很奇怪,我要求一定长度的子集合,在这里讨论的情况下,你得到一个不同长度的单个集合!