You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:47:39