解构未知长度的嵌套数组

时间:2014-11-26 22:45:02

标签: arrays clojure

我正在学习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]] __)那样构造嵌套数组,但是如何处理未知长度的数组呢?

2 个答案:

答案 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)

你想知道"值得......",为什么不直接输入两个版本并比较它们?解构表单将扩展为firstrest等......所以它都是关于代码可读性的。在这种情况下,first会更好。