从Clojure中的向量中找到“中间元素”

时间:2013-03-25 12:01:23

标签: clojure

Clojure中的简单新手问题......

如果我在Clojure向量中有奇数个元素,我该如何提取“中间”值?我已经看了一段时间,但无法理解如何做到这一点!

一些例子:

  • (middle-value [0])应该返回[0]
  • (middle-value [0 1 2])应该返回[1]
  • (middle-value [0 1 :abc 3 4])应该返回[:abc]
  • (middle-value [0 1 2 "test" 4 5 6])应该返回["test"]

3 个答案:

答案 0 :(得分:7)

如何计算中间索引并通过它进行访问?

(defn middle-value [vect]
  (when-not (empty? vect)
    (vect (quot (count vect) 2))))

答案 1 :(得分:5)

一种效率低下但有趣的实现(使用序列抽象而不是具体的向量):

(defn middle [[fst & rst]]
  (if-not rst fst
    (recur (butlast rst))))

如果元素数量相等,则返回nil

不太有趣但效率更高:

(nth v (quot (count v) 2))

其中v是向量。

答案 2 :(得分:1)

获取向量中的项目数,将其减半,将结果置于最后并获取该索引处的项目。假设一个向量v

(get v (floor (/ (count v) 2)))

不幸的是floor不在clojure.core中,您需要为此引入另一个库或直接转到java.lang.Math.floor

当然,这段代码对偶数计数向量没有任何作用,但我假设你已经可以处理它们了。