【问题标题】:Can you replicate Clojure's (partition) or Scala's sliding() functions with Guava?你能用 Guava 复制 Clojure 的(分区)或 Scala 的sliding() 函数吗?
【发布时间】: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

标签: java scala clojure guava


【解决方案1】:

Guava 没有这个,但它的AbstractIterator 可能会让“自己动手”变得更容易。

可能已经有一个feature request 申请了;如果没有,请随意。

【讨论】:

    【解决方案2】:

    Guava 目前没有类似的东西,但如果你提交issue,我们可以讨论添加它。

    对于我自己,我会使用 ArrayDeque 来存储正在运行的窗口,但这对于库方法没有意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 2011-09-22
      • 2011-07-17
      • 2012-03-02
      • 1970-01-01
      相关资源
      最近更新 更多