簡體   English   中英

Clojure-使用最大值ArrayMap獲取鍵

[英]Clojure - Get key with max value ArrayMap

我有一個數據集,看起來像這樣:

({"1880" 5} {"1951" 6} {"1952" 5} {"1976" 10} {"1902" 7} {"1919" 7} {"1949" 12} {"1814" 4} {"1930" 11})

我正在嘗試獲取具有最高價值的鑰匙。 因此,在上述情況下,我想取回值"1949" 我相信我的答案取決於max-key ,但是我不完全了解max-key工作原理。 為了清楚起見,一個答案是查看字符串值:

我想要字符串"1949"作為結果,因為它具有與之關聯的最高數字12

只需使用max-key ,該函數具有從每個地圖中獲取val的功能:

(def data
  [{"1880" 5} {"1951" 6} {"1952" 5} {"1976" 10} {"1902" 7} {"1919" 7} {"1949" 12} {"1814" 4} {"1930" 11}])

(apply max-key #(val (first %)) data) => {"1949" 12}

您需要第first函數將每個單個元素映射轉換為MapEntry 然后,您可以使用val函數從MapEntry中獲取值:

     (first {"1880" 5})    =>  <#clojure.lang.MapEntry ["1880" 5]>

(val (first {"1880" 5}))   =>  <#java.lang.Long 5>

請務必在Clojure CheatSheet上加上書簽並經常仔細閱讀!


PS為什么first為此工作:

請注意,您可以使用seqvec將地圖轉換為MapEntry的序列:

some-map               => <#clojure.lang.PersistentArrayMap {:a 1, :b 2}> 

(seq some-map)         => <#clojure.lang.PersistentArrayMap$Seq ([:a 1] [:b 2])>
(vec some-map)         => <#clojure.lang.PersistentVector [[:a 1] [:b 2]]>

然后,您需要此seq / vector中的第一項,這是first

(first (vec some-map)) => <#clojure.lang.MapEntry [:a 1]>

但是請注意, first ,您對傳遞給它的任何內容都隱式調用seq ,因此我們可以跳過轉換,而first讓我們將地圖隱式轉換為MapEntry的seq:

(first some-map)  => <#clojure.lang.MapEntry [:a 1]>

您可以按其中的每個地圖的對地圖列表進行排序。

(last (sort-by (comp second first) data))
=> {"1949" 12}

但是,查看數據,我想知道這將不僅僅是一張地圖,而是一系列地圖。 因此,我將假設您的數據永遠不會有重復的鍵,然后我們可以只使用一個地圖結構,這會更容易:

(into {} data)
=> {"1919" 7, "1880" 5, "1814" 4, "1902" 7, "1951" 6, "1949" 12, "1976" 10, "1930" 11, "1952" 5}

然后,您可以獲得類似的答案:

(last (sort-by second (into {} data)))
=> ["1949" 12]

您可以first使用這些輸出進行調用,以僅獲取字符串"1949"

這是另一種方式,使用自定義/反向比較器對降序進行排序:

(->> (into {} data)
     (sort-by second #(compare %2 %1))
     (ffirst))
 => "1949"

由於您的鍵不是數字(它們是字符串),因此您必須在不強制轉換為數字的情況下使用max-key

您可以通過以下方式實現所需的結果:

(last (sort (mapcat keys ({"1889" 1} {"1990" 2}))))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM