【问题标题】:clojure set of maps - basic filteringclojure 地图集 - 基本过滤
【发布时间】:2012-08-18 18:47:37
【问题描述】:

Clojure 初学者在这里..

如果我有一组地图,比如

 (def kids #{{:name "Noah" :age 5}
     {:name "George":age 3}
     {:name "Reagan" :age 1.5}})  

我知道我可以得到这样的名字

  (map :name kids)

1) 如何选择特定地图?例如 我想取回 name="Reagan" 的地图。

 {:name "Reagan" :age 1.5}

这可以使用过滤器完成吗?

2) 返回age = 3的名字怎么样?

【问题讨论】:

    标签: clojure


    【解决方案1】:

    是的,您可以使用filter

    (filter #(= (:name %) "Reagan") kids)
    
    (filter #(= (:age %) 3) kids)
    

    【讨论】:

      【解决方案2】:

      clojure.set/select:

      (clojure.set/select set-of-maps #(-> % :age (= 3)))
      

      name"Reagan" 也是如此。在这种情况下,返回值将是一个集合。

      你也可以在没有任何特殊准备的情况下使用filter,因为filter在它的集合参数上调用seq(编辑:正如我在输入这个时ffriend已经描述的那样)

      (filter #(-> % :age (= 3))) set-of-maps)
      

      这里的返回值将是一个惰性序列。

      如果您知道集合中只有一项满足您的谓词,some 会更有效(因为它在找到匹配项后不会处理任何其他元素):

      (some #(if (-> % :age (= 3)) %) set-of-maps)
      

      这里的返回值将是匹配的元素。

      【讨论】:

      • 感谢惰性序列,您也可以高效地执行(first (filter …
      • 没错,我想我最喜欢它作为更自我记录的选项(无论如何,在我看来)。 some 在昂贵的谓词方面仍然具有优势(由于分块)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      相关资源
      最近更新 更多