如果n小于大小,xs.sliding(n)的行为是否不一致?

时间:2011-10-31 19:32:54

标签: scala scala-collections

根据scaladoc,sliding()返回... “产生大小为size的可迭代集合的迭代器,除了最后一个元素,如果元素少于size,则会截断它。”

对我来说,直观地说,slide(n)将返回n个元素 的滑动窗口(如果可用) 。对于当前的实现,我需要执行额外的检查以确保我没有获得1或2个元素的列表。

scala> val xs = List(1, 2)
xs: List[Int] = List(1, 2)

scala> xs.sliding(3).toList
res2: List[List[Int]] = List(List(1, 2))

我在这里期待一个空列表。为什么用这种方式实现sliding()呢?

3 个答案:

答案 0 :(得分:12)

was a mistake,但从2.9开始没有修复。每个人偶尔会出现设计错误,一旦进入图书馆,删除它就是一项非常重要的任务。

解决方法:添加过滤器。

xs.sliding(3).filter(_.size==3).toList

答案 1 :(得分:7)

您可以使用GroupedIterator#withPartial修饰符“解决”此问题。

scala> val xs = List(1, 2)
xs: List[Int] = List(1, 2)

scala> xs.iterator.sliding(3).withPartial(false).toList
res7: List[Seq[Int]] = List()

(我不知道为什么你需要说xs.iterator,但xs.sliding(3).withPartial(false)不起作用,因为你得到Iterator而不是GroupedIterator

答案 2 :(得分:1)

编辑:

检查Rex's answer(这是正确的)。我离开这只是因为(正如雷克斯在评论中所说的那样)这是设计决策背后的原始(错误)理念。


我不知道你为什么会在那里找到一个空列表,返回完整列表似乎是最好的结果,请考虑这个例子:

def slidingWindowsThing(windows : List[List[Int]]) { // do your thing

对于这种方法,您可能希望所有这些调用都能正常工作:

slidingWindowsThing((1 to 10).sliding(3))

slidingWindowsThing((1 to 3).sliding(3))

slidingWindowsThing((1 to 1).sliding(3))

这就是为什么该方法默认为大小为list.length而不是Nil(空列表)的列表。