请在 2024年Clojure调查问卷! 中分享您的想法。

欢迎来到这里!请参阅 关于 页面以获取更多关于如何使用的相关信息。

0
集合
重新标记

嗨!
又是我了。我查阅了先前对我的问题给出的答案,想执行另一个操作,但我没有得到我想要的结果。
这里的情况

我的第一个表(产品)看起来是这样的:: (产品名称 价格)
([1 (candies 6.5)] [2 (sweets 1.75)]
[3 (jam 2.99)] [4 (gum 1.25)])

我的第一个表(产品)看起来是这样的:: (客户名称 产品名称 数量)
([1 (Sara candies 3)] [2 (Joe jam 3)]
[3 (Sara gum 1)])

我试图做到的是,如果输入例如 Sara,我将得到 Sara 的销售总额,这意味着: (3*6.5 + 1*1.25) = $20.75 (在这种情况下)

输入部分我没什么问题(我从终端接收客户名称作为输入)
然而我的代码

(defn sales_prices_with_cond [name_cus] (map
 (fn [y z]
   (if (= (str name_cus) (str (nth (first z) 1)))
   list (* (Double. (nth (second y) 1)) (Integer/parseInt (nth (second z) 2))))
   )
products 
sales))
(println (reduce + sales_prices_with_cond "Sara"))

给我所有销售*数量的总和。感觉条件被跳过了,或者代码可能写得不好...
我还尝试了(some),但得到的结果是一样的...

请帮助:') .

1 答案

0

编辑

因此,我认为这里的最好建议是对数据结构进行一点重构。
我选择用映射集合来建模

(def products
  #{{:id 1
    :product_name "candies"
    :price 6.5}
   {:id 2
    :product_name "sweets"
    :price 1.75}
   {:id 3
    :product_name "jam"
    :price 2.99}
   {:id 4
    :product_name "gum"
    :price 1.25}})

(def customers
  #{{:id 1
    :name "Sara"
    :product "candies"
    :quantity 3}
   {:id 2
    :name "Joe"
    :product "jam"
    :quantity 3}
   {:id 3
    :name "Sara"
    :product "gum"
    :quantity 1}})

这种方法的好处在于可以使用 clojure.set 来操作它

(require '[clojure.set :as set])
;' needed to please the formatter

(->> (set/join customers products {:product :product_name})
     (set/select #(= (:name %) "Sara"))
     (map (fn [{:keys [price quantity]}] (* price quantity)))
     (reduce + 0))

我没有把它做成一个函数,但我想你应该已经明白了大概。

...