Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure-使用最大值数组映射获取密钥_Clojure - Fatal编程技术网

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”示例)。