Clojure - 使用最大值ArrayMap获取密钥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Clojure - 使用最大值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>

一定要给The Clojure CheatSheet添加书签并经常阅读!


附:为什么first适用于此:

请注意,您可以使用seqvec将地图转换为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}))))

以上是关于Clojure - 使用最大值ArrayMap获取密钥的主要内容,如果未能解决你的问题,请参考以下文章

使用 JNA 在 Clojure 中按值获取和传递结构

如何在 Clojure 中获取 Unix 时间戳?

ArrayMap代码分析

Android内存优化(使用SparseArray和ArrayMap代替HashMap)

HashMap与ArrayMap的区别2

Clojure按值获取映射键