【发布时间】:2012-06-10 03:34:10
【问题描述】:
我有一个列表,我想以类似于 Clojure 的 (partition sz step col) 方法或 Scala 的 IterableLike.sliding(size: Int, step: Int) 函数的方式拆分它。具体来说,给定一个类似的列表:
(1, 2, 3)
我希望能够遍历子列表,例如:
(1, 2), (2, 3)
在 Clojure 中,这将通过以下方式完成:
(partition 2 1 (1, 2, 3))
对于 Scala,它会是:
val it = Vector(1, 2, 3).sliding(2)
但是我没有这样的奢侈,我希望避免自己动手。 Guava 有一种接近的分区方法,但不提供重叠。谷歌搜索也没有结果。这种方法是否存在,还是我必须自己推出?
【问题讨论】:
-
如果没有人知道更好的方法,您可以合并两个番石榴分区,其中第二个来自删除了一个元素的序列...
-
你不需要 size 个分区吗?好主意。
-
你可以使用地图,比如:
(map (fn [x y] '(x,y)) lst (rest lst)) -
我目前已经通过实现 Iterator
并添加了 nextWindow() 方法推出了自己的方法,但我仍然很好奇这是否可以使用 Guava。看起来它应该能够做到,但是 partition()方法之一缺少一个参数。 -
@LouisWasserman:典型的用例是计算移动平均线:en.wikipedia.org/wiki/Moving_average