Clojure 从 zipmap 获得最高价值

Clojure getting highest value from zipmap

所以我在这里得到了我建议的 zip 地图,它工作得很好。如您所见,我已经加载了数据。

这就是它在 repl 中的样子,非常完美。 地图就在这里

:Year 2020, :Day 27, :January 59, :February 38
:Year 2020, :Day 28, :January 41, :February 57
:Year 2020, :Day 29, :January 56, :February 51
:Year 2020, :Day 31, :January 94, :February -999
:Year 2020, :Day 30, :January 76, :February -999 

(map [:Day :Month

请记住,这只是我完成的代码片段。你会如何建议我找到一月份价值最高的一天?我所说的最高是指月份旁边的数字

(into(sorted-map-by >(fn [:January]))Ha) 

我试过了没有成功,最后的“Ha”只是我初始化 zipmap 并使用 io/reader 读取文件的函数的名称

不确定您的确切数据结构是什么样的,但假设它是一个地图向量,您可以这样做:

(def data
  [{:Year 2020, :Day 27, :January 59, :February 38}
   {:Year 2020, :Day 28, :January 41, :February 57}
   {:Year 2020, :Day 29, :January 56, :February 51}
   {:Year 2020, :Day 31, :January 94, :February -999}
   {:Year 2020, :Day 30, :January 76, :February -999}])

(->> data
     (sort-by :January)
     last
     :January)
;; => 94

通过使用关键字作为函数对向量进行排序以在地图中查找其值,然后取一月份具有最高值的向量,然后从中获取属于键 :January 的值向量。如果您的数据结构看起来有点不同,请告诉我。

我会用 max-key and reduce:

(def data [{:Year 2020, :Day 27, :January 59, :February 38}
           {:Year 2020, :Day 28, :January 41, :February 57}
           {:Year 2020, :Day 29, :January 56, :February 51}
           {:Year 2020, :Day 31, :January 94, :February -999}
           {:Year 2020, :Day 30, :January 76, :February -999}])

(reduce (partial max-key :January) data)
;; => {:Year 2020, :Day 31, :January 94, :February -999}

(:Day (reduce (partial max-key :January) data))
;; => 31

@Rulle 的回答很好。 没有 max-key 它将是:

(def data [{:Year 2020, :Day 27, :January 59, :February 38}
           {:Year 2020, :Day 28, :January 41, :February 57}
           {:Year 2020, :Day 29, :January 56, :February 51}
           {:Year 2020, :Day 31, :January 94, :February -999}
           {:Year 2020, :Day 30, :January 76, :February -999}])

(defn seq-max [seq greater key]
  (reduce (fn [a b] (if (greater (key a) (key b)) a b)) seq))
;; if no key is wanted, choose the function `identity` as key!
;; e.g.
;; (seq-max (map :January data) > identity)
;; => 94

(:Day (seq-max data > :January)) ;; => 31