2024 Clojure状态调查中分享您的想法!

欢迎!请参阅关于页面以获取更多关于此功能的信息。

0
集合
重新贴标签

嗨!
又是我了。我跟踪了我提问的之前的答案,并尝试进行另一个操作,但结果并不符合我的预期。
这是情况:

我的第一个表(产品)看起来像: (产品名 价格)
([(1 (糖果 6.5)] [2 (甜点 1.75)]
[3 (果酱 2.99)] [4 (口香糖 1.25)])

我的第一个表(产品)看起来像: (客户名 产品名 数量)
([(1 (Sara 糖果 3)] [2 (Joe 果酱 3)]
[3 (Sara 口香糖 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))

我没有将其制作成一个函数,但我想您已经明白了其要点。

...