我正在学习Clojure,我有一个关于编码以下内容的最佳方法的问题:我想返回数组中频率最高的数字。鉴于存在frequency
方法,这应该相当容易。
但我不能决定我的方法是否惯用。这就是我所拥有的:
(defn highest-rank [coll]
(let [[element frequency] (first (reverse (sort-by second (frequencies coll))))]
element))
特别值得声明一个变量并在这里使用解构?或者我应该只使用first
两次?
或者我应该对整个阵列进行解构?这样我就可以制作更具针对性的东西,比如sort-by frequency
?它甚至可能吗?
这引出了我对这个问题的技术部分:我知道我可以像(let [[a,b] [c, d]] __)
那样构造嵌套数组,但是如何处理未知长度的数组呢?
答案 0 :(得分:1)
您不需要排序和反转。这是一种更简单的方法:
(defn highest-rank [coll]
(first (apply max-key val (frequencies coll))))
编辑:关于您的其他问题,您可以构建无限集合,例如:
(let [[[a b] [c d] _ ] (map-indexed vector (range))] (println a b c d))
=> 0 0 1 1
答案 1 :(得分:1)
当然,您可以构建一个未知长度的集合:
(let [[[a b] [c d] & _] the-collection] do-something)
你想知道"值得......",为什么不直接输入两个版本并比较它们?解构表单将扩展为first
,rest
等......所以它都是关于代码可读性的。在这种情况下,first
会更好。