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

欢迎!有关本站如何工作的更多信息,请参阅关于页面。

0
集合
重新标记

嗨!
还是我。我在之前的回答的基础上继续进行了另一个操作,但并没有得到我想要的结果。
情况如下

我的第一个表(products)看起来像这样的:(product_name price)
([1 (candies 6.5)] [2 (sweets 1.75)]
[3 (jam 2.99)] [4 (gum 1.25)])

我的第一个表(products)看起来像这样的:(customer_name product_name quantity)
([1 (Sara candies 3)] [2 (Joe jam 3)]
[3 (Sara gum 1)])

我试图做的是,如果输入例如Sarah,我会得到Sarah所做销售的总和,即:(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))

我没有将这个做成一个函数,但我想你已经理解了这个思路。

...