Непоследовательное поведение для xs.sliding (n), если n меньше размера? - PullRequest
15 голосов
/ 31 октября 2011

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

Для меня интуитивно, скольжение (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))

Я ожидал здесь пустой список. Почему slide () реализован таким образом?

Ответы [ 3 ]

12 голосов
/ 01 ноября 2011

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

Обходной путь: добавьте фильтр.

xs.sliding(3).filter(_.size==3).toList
7 голосов
/ 01 ноября 2011

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

1 голос
/ 01 ноября 2011

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

...