【发布时间】:2015-09-17 15:51:11
【问题描述】:
我有一个包含数万个元素的集合(Java 列表),我正在编写一个 Clojure 函数,该函数需要根据谓词将此列表分成几个部分。最后,我有几个 Clojure 集合,其中只有与集合关联的谓词匹配的元素。
以下代码解决了我的问题,但对输入列表进行了 3 次迭代。有没有更好的方法来做到这一点?
(defn divide-into-groups [col]
(let [one (filter #(< % 3) col)
two (filter #(and (>= % 3) (< % 6)) col)
three (filter #(>= % 6) col)]
[one two three]))
(divide-into-groups (shuffle (range 10)))
;[(2 0 1) (4 3 5) (6 8 7 9)]
我真的在寻找一个实用的 Clojure 解决方案。我已经知道我可以创建三个集合作为 vars 并在 divide-into-groups 函数中改变它们,也许这就是 Clojure 的方式。如果是,请说出来。
(注意:我上面使用的谓词不是我的生产代码中的谓词。我正在使用的数据也不是数字。这只是一个 SSCCE。这个问题的答案必须适用于一般问题集合中有任意数据和任意谓词。当然,性能很好。要清楚的是,filter 返回的惰性列表将全部被完全迭代并用于生成一些输出。所以我不能依赖惰性解决方案;- )
【问题讨论】:
-
是否保证完全其中一个函数总是正确的?
-
是的,其中一个函数总是正确的。
标签: clojure