Clojure-使用最大值数组映射获取密钥
我有一个如下所示的数据集:Clojure-使用最大值数组映射获取密钥,clojure,Clojure,我有一个如下所示的数据集: ({"1880" 5} {"1951" 6} {"1952" 5} {"1976" 10} {"1902" 7} {"1919" 7} {"1949" 12} {"1814" 4} {"1930" 11}) (last (sort-by second (into {} data))) => ["1949" 12] 我正在尝试获取具有最高值的密钥。所以在上面的例子中,我想得到值“1949”。我相信我的答案在于max key,但是我不完全理解max key是如何
({"1880" 5} {"1951" 6} {"1952" 5} {"1976" 10} {"1902" 7} {"1919" 7} {"1949" 12} {"1814" 4} {"1930" 11})
(last (sort-by second (into {} data)))
=> ["1949" 12]
我正在尝试获取具有最高值的密钥。所以在上面的例子中,我想得到值“1949”
。我相信我的答案在于max key
,但是我不完全理解max key
是如何工作的。为了清楚起见,一个答案是关于查看字符串值:
我希望字符串
“1949”
作为结果,因为它与12
中的最大数字关联。您可以根据其中每个地图的值对地图列表进行排序
(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}
然后你可以得到如下相同的答案:
({"1880" 5} {"1951" 6} {"1952" 5} {"1976" 10} {"1902" 7} {"1919" 7} {"1949" 12} {"1814" 4} {"1930" 11})
(last (sort-by second (into {} data)))
=> ["1949" 12]
您可以使用这些输出首先调用
,以仅获取字符串“1949”
下面是另一种方法,使用自定义/反向比较器进行降序排序:
(->> (into {} data)
(sort-by second #(compare %2 %1))
(ffirst))
=> "1949"
由于您的键不是数字(它们是字符串),因此如果不转换为数字,就不能使用
max key
您可以通过以下方式实现所需的结果:
(last (sort (mapcat keys ({"1889" 1} {"1990" 2}))))
只需使用
max键
,即可从每个地图中获取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
函数从映射条目中获取值:
(first {"1880" 5}) => <#clojure.lang.MapEntry ["1880" 5]>
(val (first {"1880" 5})) => <#java.lang.Long 5>
然后,您需要此seq/vector中的第一项,即first
的输入:
(first (vec some-map)) => <#clojure.lang.MapEntry [:a 1]>
我想你误解了这个问题。目标是找到具有最高整数值的字符串“key”(参见他给出的“1949”示例)。