[英]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上加上書簽並經常仔細閱讀!
first
為此工作: 請注意,您可以使用seq
或vec
將地圖轉換為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.