clojure - 在 Clojure 中如何组合排序和过滤?

标签 clojure

假设我有一个字符串集合,我想返回长度超过 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/

相关文章:

java - 如何找出 Clojure 函数允许的选项(spit)?

clojure - 为什么算?在一种情况下返回 true 而在另一种情况下返回 false?

jquery-ui - 是否有 Clojurescript 库来替换 jQueryUI Sortable?

clojure - 为什么我在没有显式递归的函数上收到 StackoverflowError

macros - clojure 宏 if-empty?

clojure - 如何将 Leiningen 模板部署到 Clojars?

clojure - 接受 clojure.xml/parse 调用的 header

clojure - clojure 中的 (defn function-name) 和 (defn- function-name) 有什么区别?

clojure - 在 let 之外使用 var - clojure

unit-testing - 在单独的框架中即时对 Clojure 进行单元测试