Clojure如何从ArrayMap集合中获取值最大的键
嘿,刚好熟悉max-key的用法,来帮你解决这个问题!
首先先给你拆解max-key的核心逻辑:它的作用是根据你指定的规则,从一堆元素里找出“最大”的那个。具体来说,你需要先给它一个「提取函数」——这个函数负责从每个元素里拿出用来比较的“关键值”,然后max-key会用这个关键值的大小来判断哪个元素是最大的,最后返回对应的原始元素。
针对你的数据集,你的需求是「比较每个键值对的数值大小,找出数值最大的那个键」,那我们只需要告诉max-key:“用每个元素里的数值来做比较”就行了。
分情况看具体实现
假设你的数据是用类似Clojure/Scheme的语法表示的,我分两种常见的结构给你示例:
情况1:数据是单键值的map集合
比如你给出的格式:({"1880" 5} {"1951" 6} ...),每个元素是一个只有一个键值对的map。
首先定义你的数据:
(def data '({"1880" 5} {"1951" 6} {"1952" 5} {"1976" 10} {"1902" 7} {"1919" 7} {"1949" 12} {"1814" 4} {"1930" 11}))
然后用max-key,我们需要写一个函数从每个map里取出数值:
;; 先找出数值最大的那个map (def max-map (max-key (fn [m] (apply val m)) data)) ;; 再从这个map里取出对应的键 (apply key max-map)
运行后就会得到"1949",完全符合你的需求。
情况2:数据是键值对vector集合(更常用)
如果你的数据是用vector存储的键值对(比如[["1880" 5] ["1951" 6] ...]),代码会更简洁:
(def data [["1880" 5] ["1951" 6] ["1952" 5] ["1976" 10] ["1902" 7] ["1919" 7] ["1949" 12] ["1814" 4] ["1930" 11]]) ;; 用second提取每个vector的第二个元素(数值)做比较,再取第一个元素(键) (first (max-key second data))
这里max-key second data会直接返回数值最大的那个vector["1949" 12],first就能拿到对应的键。
关键注意点
你提到“关注数值大小而非键的字符串值”,这里的核心就是提取函数一定要拿到数值——不管是用(apply val m)还是second,都是在拿每个元素里的数值部分,这样max-key就会按照数值的大小来比较,而不会去管键的字符串排序,完全满足你的要求。
内容的提问来源于stack exchange,提问作者Terramet

