我有一个如下所示的数据集:
({"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
答案 0 :(得分:1)
只需使用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>
请务必为The 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的序列&# 39;对我们来说:
(first some-map) => <#clojure.lang.MapEntry [:a 1]>
答案 1 :(得分:0)
您可以按照其中每张地图的值对地图列表进行排序。
(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"
答案 2 :(得分:0)
由于您的密钥不是数字(它们是字符串),因此您无法使用max-key
而无需转换为数字。
您可以通过以下方式获得所需的结果:
(last (sort (mapcat keys ({"1889" 1} {"1990" 2}))))