Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
clojure:通过键和值过滤映射向量_Clojure_Elementary Functions - Fatal编程技术网

clojure:通过键和值过滤映射向量

clojure:通过键和值过滤映射向量,clojure,elementary-functions,Clojure,Elementary Functions,我有一个像这样的地图向量 (def map1 [{:name "name1" :field "xxx"} {:name "name2" :requires {"element1" 1}} {:name "name3" :consumes {"element2" 1 "element3" 4}}]) 我试图定义一个函数,它接受一个映射,比如{“element1”1“element3”6}(即:有n个字段,或者{}),并在map

我有一个像这样的地图向量

  (def map1 
    [{:name "name1"
      :field "xxx"}
     {:name "name2"
      :requires {"element1" 1}}
     {:name "name3"
      :consumes {"element2" 1 "element3" 4}}])
我试图定义一个函数,它接受一个映射,比如
{“element1”1“element3”6}
(即:有n个字段,或者
{}
),并在
map1
中对映射进行筛选,只返回那些没有
需要
消耗
的映射,或者在所提供的映射中,与它们关联的数字小于与该键关联的数字(如果所提供的映射没有任何类似的键,则不会返回)

但是我没有掌握如何处理映射递归循环和过滤

(defn getV [node nodes]

  (defn filterType [type nodes]
    (filter (fn [x] (if (contains? x type)
                    false ; filter for key values here
                    true)) nodes))

  (filterType :requires (filterType :consumes nodes)))

有两种方法来看待这样的问题:从外到内或从内到外。在使用嵌套结构时,仔细命名确实有帮助。例如,调用map1的向量可能会增加混乱

从外部开始,您需要一个谓词函数来过滤列表。此函数将地图作为参数,并由过滤器函数使用

(defn comparisons [m]
   ...)

(filter comparisons map1)
我不确定自己是否能准确地理解这些比较,但似乎至少有两种口味。第一个是查找没有:requires或:consumes键的映射

(defn no-requires-or-consumes [m]
   ...)

(defn all-keys-higher-than-values [m]
  ...)

(defn comparisons [m]
   (some #(% m) [no-requires-or-consumes all-keys-higher-than-values]))
然后是定义单个比较函数的问题

(defn no-requires-or-consumes [m]
   (and (not (:requires m)) (not (:consumes m))))
第二个更复杂。它在一个或两个内部映射上运行,但在这两种情况下的行为是相同的,因此真正的实现可以被推到另一个级别

(defn all-keys-higher-than-values [m]
  (every? keys-higher-than-values [(:requires m) (:consumes m)]))
比较的关键是查看地图关键部分的数字与值。将细节向下推一个级别,可以得到:

(defn keys-higher-than-values [m]
  (every? #(>= (number-from-key %) (get m %)) (keys m)))
注意:我在这里选择了>=以便示例数据中的第二个条目将通过

这只剩下拉动键字符串的数量。如何做到这一点,请访问

将所有这些串在一起并针对示例数据运行将返回第一个和第二个条目

把所有东西放在一起:

(defn no-requires-or-consumes [m]
   (and (not (:requires m)) (not (:consumes m))))

(defn number-from-key [s]
   (read-string (re-find #"\d+" s)))

(defn all-keys-higher-than-values [m]
  (every? keys-higher-than-values [(:requires m) (:consumes m)]))

(defn keys-higher-than-values [m]
 (every? #(>= (number-from-key %) (get m %)) (keys m)))

(defn comparisons [m]
  (some #(% m) [no-requires-or-consumes all-keys-higher-than-values]))

(filter comparisons map1)

你好,戴维斯!我编辑了这个问题,以反映我在代码方面的具体情况。非常感谢您在这件事上花时间帮助我!但是,我无法理解如何为函数提供过滤映射(即
{“element1”1“element3”6}
),因为我只看到每个函数的一个参数。我遗漏了什么?keys higher that values函数正在检查映射m中传递的每个键。我的问题是如何运行这些函数?使用
(筛选比较映射1)
将不起作用(因为它不应该起作用,但我不明白应该在哪里指定筛选映射)(筛选比较映射1)是您应该做的。我编辑了答案,把所有的部分放在一起。很抱歉,一定是误会了!在我的问题中,我问了“一个函数,它接受像{“element1”1“element3”6}这样的映射,并对映射1中的映射进行筛选…”,我必须说我不完全理解您的代码,但该函数应该有两个参数:映射1和过滤映射
(defn no-requires-or-consumes [m]
   (and (not (:requires m)) (not (:consumes m))))

(defn number-from-key [s]
   (read-string (re-find #"\d+" s)))

(defn all-keys-higher-than-values [m]
  (every? keys-higher-than-values [(:requires m) (:consumes m)]))

(defn keys-higher-than-values [m]
 (every? #(>= (number-from-key %) (get m %)) (keys m)))

(defn comparisons [m]
  (some #(% m) [no-requires-or-consumes all-keys-higher-than-values]))

(filter comparisons map1)