【问题标题】:Find if a map contains multiple keys查找地图是否包含多个键
【发布时间】:2015-01-13 02:24:59
【问题描述】:

我是 Clojure 的新手,我想知道是否有一种方法可以测试地图是否有多个键。我注意到contains? 只检查一个键

我想做什么:

(def mario 
    {:position {:x 1 :y 2}
     :velocity {:x 2 :y 0}
     :mass 20})

;;Test if mario has a position and a velocity
(contains-many? mario :position :velocity) ;;true

;;Test if mario has a mass and a jump-height
(contains-many? mario :mass :jump-height) ;;false

基本上,clojure 库中是否有类似 contains-many? 的函数,如果没有,您将如何实现 contains-many? 函数?

【问题讨论】:

    标签: clojure clojurescript


    【解决方案1】:

    显示了正确的答案,但我想指出另一个优雅的解决方案,它假定有关地图值的知识。当您确定它们是真实的时(即:不是nil 而不是false):

    (every? m ks)
    

    这是因为 map 是(一元)函数,它们将相应的值返回给参数。但请注意({:x nil} :x) => nil

    【讨论】:

    • 地图是函数?!哇!好吧,我确定我的值不是nil,但它们可以是false。所以,我认为这次我不能使用这个技巧,但我一定会记住它以备不时之需,谢谢!
    【解决方案2】:

    我不知道有什么功能可以做到这一点。还需要定义您希望地图包含 每个 键还是仅包含 一些 键。我选择了 every 案例,如果您想要 some 版本,只需将 every? 替换为 some?

    我的直接,未优化的版本是:

    (defn contains-many? [m & ks]
      (every? #(contains? m %) ks))
    

    已经过测试:

    (deftest a-test
      (testing "Basic test cases"
        (let [m {:a 1 :b 1 :c 2}]
          (is (contains-many? m :a))
          (is (contains-many? m :a :b))
          (is (contains-many? m :a :b :c))
          (is (not (contains-many? m :a :d)))
          (is (not (contains-many? m :a :b :d))))))
    

    编辑:使用noisesmith的建议进行简化

    【讨论】:

    • 酷!谢谢。是的,我希望该功能可以测试地图是否具有每个键。谢谢。快速提问:这个语法是什么:#(contains? m %) 这就像柯里化或模式匹配之类的吗?
    • 这是一个语法糖,用于创建一个参数的匿名函数(用 % 表示)。它相当于(fn [k] (contains? m k))clojuredocs.org/clojure.core/fn
    • 酷!谢谢。我懂了。语法糖确实使它更加紧凑和可读。
    • 更简单的版本:(every? #(contains? m %) ks)
    【解决方案3】:

    这是另一个使用 clojure.set 的解决方案,它适用于非真实值:

    (require '[clojure.set :as set])
    
    (defn contains-many? [m & ks]
      (empty? (set/difference (set ks) (set (keys m)))))
    

    【讨论】:

      【解决方案4】:

      您可以利用clojure.set/subset?

      (clojure.set/subset?
        #{:position :velocity}
        (set (keys mario)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-04
        • 2011-03-09
        • 2021-11-22
        • 2012-09-28
        • 2022-01-05
        相关资源
        最近更新 更多