Inconsistent behaviour for xs.sliding(n) if n is less than size?

老子叫甜甜 提交于 2019-12-29 08:27:16

问题


According to scaladoc, sliding() returns... "An iterator producing iterable collections of size size, except the last and the only element will be truncated if there are fewer elements than size."

For me, intuitivelly, sliding(n) would return a sliding window of n elements if available. With the current implementation, I need to perform an extra check to make sure I don't get a list of 1 or 2 elements.

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))

I expected here an empty list instead. Why is sliding() implemented this way instead?


回答1:


It was a mistake, but wasn't fixed as of 2.9. Everyone occasionally makes design errors, and once one gets into the library it's a nontrivial task to remove it.

Workaround: add a filter.

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



回答2:


You can "work around" this by using the GroupedIterator#withPartial modifier.

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()

(I don't know why you need to say xs.iterator but xs.sliding(3).withPartial(false) does not work because you get an Iterator instead of a GroupedIterator.




回答3:


EDIT:

Check Rex's answer (which is the correct one). I'm leaving this just because (as Rex said on the comments) it was the original (wrong) idea behind that design decision.


I don't know why you would expect an empty list there, returning the full list seems like the best result, consider this example:

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

For this methods you probably want all these calls to work:

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

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

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

This is why the method defaults to a list of size list.length instead of Nil (empty list).



来源:https://stackoverflow.com/questions/7958712/inconsistent-behaviour-for-xs-slidingn-if-n-is-less-than-size

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!