Непоследовательное поведение для 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
(пустой список).