clojure - 使用reduce找到最大值

标签 clojure

具有 java 背景的 clojure 新手。我有下表,需要将该表转换为 HashMap ,将产品映射到销售额最高的城市。例如,输出应如下所示:

{"Pencil": "Toronto"
"Bread": "Ottawa"}

(def table [
    {:product "Pencil"
    :city "Toronto"
    :year "2010"
    :sales "2653.00"}
    {:product "Pencil"
    :city "Oshawa"
    :year "2010"
    :sales "525.00"}
    {:product "Bread"
    :city "Toronto"
    :year "2010"
    :sales "136,264.00"}
    {:product "Bread"
    :city "Oshawa"
    :year "nil"
    :sales "242,634.00"}
    {:product "Bread"
    :city "Ottawa"
    :year "2011"
    :sales "426,164.00"}])

这是我到目前为止所拥有的:

(reduce (fn [product-cities {:keys [product sales]}]
         (update-in product-cities [product] (fnil conj []) sales))
       {}
       table)

这会产生结果:

{"Bread"
["136,264.00"
"242,634.00"
"426,164.00"],
 "Pencil" ["2653.00" "525.00"]}

如何比较每个城市的销售额,并且只保留销售额最高的城市名称?经历了一段非常艰难的时期。谢谢

最佳答案

clojure.core中有一个方便的函数max-key,非常适合这种情况:

(defn process [table]
  (let [parseDouble #(Double/parseDouble (clojure.string/replace % #"," ""))]
    (->> table
         (group-by :product)
         (map (comp (juxt :product :city)
                    (partial apply max-key (comp parseDouble :sales))
                    val))
         (into {}))))

user> (process table)
;;=> {"Pencil" "Toronto", "Bread" "Ottawa"}

关键是 (partial apply max-key (comp parseDouble :sales)) 部分在组中查找具有最大解析销售值的记录。

关于clojure - 使用reduce找到最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47291914/

相关文章:

clojure - 数据拉取表达式

recursion - 在 Clojure 中,是否可以将 memoization 和尾调用优化结合起来?

eclipse - 在 IDE 中使用 clojure 和 leiningen

clojure - 在 Clojure 中,读取在命令提示符下指定的文件

api - 获取 Clojure 库的 API 文档

clojure - 如何使用函数更新 map 值?

clojure - 如何按路径过滤 map 内容

clojure - with-meta vs ^{} - Clojure

clojure - `map` 函数可以返回向量而不是列表吗?

clojure - clojure.spec 中的禁止键