Clojure中数组的最后一个元素

时间:2014-02-11 18:03:00

标签: arrays clojure

除了这个函数之外,还有更简单的方法可以在clojure中找到数组的最后一个元素吗?

(fn [l] (if (empty? (rest l)) (first l) (recur (rest l))))

2 个答案:

答案 0 :(得分:10)

对于向量,请使用peek获取恒定时间

 user=> (peek [1 2 3 4 5])
 5

对于Java数组,

user=> (let [a (to-array [1 2 3 4 5])] (aget a (dec (alength a))))
5

对于常规集合,您可以使用last获取线性时间内的最后一项。它的定义与您所做的类似。

user=> (source last)
(def
 ^{:arglists '([coll])
   :doc "Return the last item in coll, in linear time"
   :added "1.0"
   :static true}
 last (fn ^:static last [s]
        (if (next s)
          (recur (next s))
          (first s))))

答案 1 :(得分:1)

最简单的方法是使用在线性时间内工作的(last l)http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/last

另一种可能性是撤消你的收藏并采取第一个元素:((comp first reverse) l)。但是反向返回非惰性序列时速度相当慢。注意:comp返回其参数(函数)(http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/comp

的组合

您还可以先将集合转换为矢量,然后应用peek:((comp peek vec) l)。这应该有更好的表现。

另一个:确定集合的长度并采用最后一个元素(#(nth % (dec (count %))) l)

这些函数适用于所有集合类型(例如矢量,列表等)。在Clojure中本身没有数组(除了你想使用Java数组)。