假设我有一个字符串集合,我想返回长度超过 4 个字符的所有字符串,首先按最短的字符串排序。
您可以通过以下方式解决这个问题:
(def strings ["this" "is" "super" "cool" "everybody" "isn't" "clojure" "great!?!?"])
(sort-by count < (filter #(> (count %) 4) strings))
;; > ("super" "isn't" "clojure" "everybody" "great!?!?")
请注意,我们使用了 count
两次。这在这里可能没问题,但是如果 count
不是 count
呢?如果我们不调用 count
而是调用 super-expensey-function
,而我们确实不想运行超过绝对必要的部分,该怎么办?
所以:
- 我们有很多东西
- 我们想要返回有序的事物集合
- 使用计算量大的函数的结果进行过滤和排序,每个事物只能调用一次
是否有现有的函数可以执行此操作,或者我需要构建自己的函数吗?
最佳答案
最简单的解决方案是将每个项目与其计算成本高昂的属性配对,然后过滤和排序,然后丢弃参数:
(->> strings
(map (juxt identity count))
(filter (fn [[_ c]] (> c 4)))
(sort-by peek)
(map first))
如果计算相关属性确实非常昂贵,那么分配向量的开销应该几乎消失。
关于clojure - 在 Clojure 中如何组合排序和过滤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18201821/