4

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"]
4

3 回答 3

7

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

(defn middle-value [vect]
  (when-not (empty? vect)
    (vect (quot (count vect) 2))))
于 2013-03-25T12:10:39.513 回答
5

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

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

在元素数量偶数的情况下返回nil

不那么有趣但更高效:

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

v向量在哪里。

于 2013-03-25T14:53:59.640 回答
1

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

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

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

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

于 2013-03-25T12:09:38.967 回答