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
Collections Clojure:对映射集合中的值求和,直到达到某个值为止。_Collections_Clojure_Maps - Fatal编程技术网

Collections Clojure:对映射集合中的值求和,直到达到某个值为止。

Collections Clojure:对映射集合中的值求和,直到达到某个值为止。,collections,clojure,maps,Collections,Clojure,Maps,我的目标是将地图集合中的值相加,直到其中一个地图值达到某个值为止。我试着用它来解决这个问题,但它没有涉及到我如何只能抓住列表的一部分。然后返回集合,但不返回经过的值。像这样的 (def foo '({:key 1, :value 2} {:key 1, :value 2} {:key 1, :value 2}) (defn addValuesUp [foo] (take-while (< ((apply merge-with + foo) :value) 4) foo)) and h

我的目标是将地图集合中的值相加,直到其中一个地图值达到某个值为止。我试着用它来解决这个问题,但它没有涉及到我如何只能抓住列表的一部分。然后返回集合,但不返回经过的值。像这样的

(def foo '({:key 1, :value 2} {:key 1, :value 2} {:key 1, :value 2})
(defn addValuesUp [foo]
  (take-while (< ((apply merge-with + foo) :value) 4) foo))
 and have it return something like this
'({:key 1, :value 2} {:key 1, :value 2})   
(def foo'({:键1,:值2}{:键1,:值2}{:键1,:值2})
(defn addValuesUp[foo]
(暂停(<((应用与+foo合并):值)4)foo))
让它像这样返回
“({:键1,:值2}{:键1,:值2}”)

相反,我得到一个错误,布尔值不能转换为clojure.lang.IFn

请查看
take while
的文档:

clojure.core/take-while
([pred coll])
  Returns a lazy sequence of successive items from coll while
  (pred item) returns true. pred must be free of side-effects.
在本例中,
pred
是一个返回布尔值的函数。在代码中,
take while
的第一个参数不是函数而是表达式

这就是为什么会出现错误
ClassCastException java.lang.Boolean无法强制转换为clojure.lang.IFn
。此错误告诉您clojure需要函数(IFn),但它找到了布尔值(表达式的结果)


一旦您将其转化为函数,您应该会取得进展。但是,在函数实现过程中可能还需要一些工作。

请查看
take while
的文档:

clojure.core/take-while
([pred coll])
  Returns a lazy sequence of successive items from coll while
  (pred item) returns true. pred must be free of side-effects.
在本例中,
pred
是一个返回布尔值的函数。在代码中,
take while
的第一个参数不是函数而是表达式

这就是为什么会出现错误
ClassCastException java.lang.Boolean无法强制转换为clojure.lang.IFn
。此错误告诉您clojure需要函数(IFn),但它找到了布尔值(表达式的结果)


一旦您将其转化为函数,您应该会取得进展。但是,在函数实现过程中可能需要更多的工作。

解决此问题的方法是在映射中添加一个新的键,并累积所有以前的值,以便您可以执行简单的take while:

(defn sums-of-values [c]
  (reductions + c))

(defn with-accum [c]
  (map #(assoc %1 :accum %2)
       c
       (sums-of-values (map :value c))))
(take-while (comp (partial >= 4)
                  :accum)
            (with-accum foo))
现在地图有了:acum插槽,您可以使用take while:

(defn sums-of-values [c]
  (reductions + c))

(defn with-accum [c]
  (map #(assoc %1 :accum %2)
       c
       (sums-of-values (map :value c))))
(take-while (comp (partial >= 4)
                  :accum)
            (with-accum foo))

我解决此问题的方法是在地图中添加一个新的键,将所有以前的值累加在一起,这样您就可以执行一个简单的take while:

(defn sums-of-values [c]
  (reductions + c))

(defn with-accum [c]
  (map #(assoc %1 :accum %2)
       c
       (sums-of-values (map :value c))))
(take-while (comp (partial >= 4)
                  :accum)
            (with-accum foo))
现在地图有了:acum插槽,您可以使用take while:

(defn sums-of-values [c]
  (reductions + c))

(defn with-accum [c]
  (map #(assoc %1 :accum %2)
       c
       (sums-of-values (map :value c))))
(take-while (comp (partial >= 4)
                  :accum)
            (with-accum foo))

这对我来说是有意义的,但我不知道如何创建一个将使用take while函数进行迭代以返回布尔值的函数。这对我来说是有意义的,但我不知道如何创建一个将使用take while函数进行迭代以返回布尔值的函数。谢谢,这对我很有效。我还添加了另一个包含(apply merge with+foo)之后,它将所有值相加,其中最后一个值在:acum slot中已经有了总数谢谢这对我有用我还添加了另一个函数,其中包含(apply merge with+foo)之后,它将所有值相加。注意,take while中的最后一个值在:accum插槽中已经具有总计