Непоследовательное поведение для xs.sliding(n), если n меньше размера?

В соответствии с scaladoc, slide() возвращает... "Итератор, создающий итерируемые коллекции размером size, за исключением последнего и единственного элемента, будет усечен, если элементов меньше, чем size."

Для меня intuitivelly, 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))

Вместо этого я ожидал пустой список. Почему вместо этого выполняется функция скольжения()?

Ответы

Ответ 1

Он был ошибкой, но не был исправлен с 2.9. Каждый из нас иногда создает ошибки в дизайне, и как только один из них попадает в библиотеку, это нетривиальная задача по его удалению.

Временное решение: добавьте фильтр.

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

Ответ 2

Вы можете "обойти" это с помощью модификатора 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.

Ответ 3

EDIT:

Отметьте ответ Рекса (что является правильным). Я оставляю это только потому, что (как сказал Рекс в комментариях) это оригинальная (неправильная) идея этого дизайнерского решения.


Я не знаю, почему вы ожидаете, что там будет пустой список, вернувшийся полный список кажется лучшим результатом, рассмотрим этот пример:

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 (пустой список).