0

可能重复:
如果 n 小于大小,xs.sliding(n) 的行为不一致?

编辑:我意识到这里描述的行为是滑动的预期行为;我在质疑为什么会这样。

编辑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
    }
}

这现在按预期工作。

有谁知道为什么滑动会这样?我要求一定长度的子集合对我来说似乎很奇怪,而在此处讨论的情况下,您会得到一个不同长度的集合!

4

0 回答 0