在Clojure中从向量中查找“中间元素”

4

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

2
当元素数量为偶数时,它应该返回什么? - Jeremy
@Jeremy Heiler - 这永远不会发生,所以我不担心它。 - monch1962
3个回答

7
如何计算中间索引并通过它访问?
(defn middle-value [vect]
  (when-not (empty? vect)
    (vect (quot (count vect) 2))))

1
你可以使用 (quot (count vect) 2) - Ankur

5
一种有趣但效率较低的实现方式(使用序列抽象而不是具体向量):
(defn middle [[fst & rst]]
  (if-not rst fst
    (recur (butlast rst))))

如果元素数量为偶数,则返回nil

不太有趣但更有效的方法:

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

其中v是向量。


解构将使rst在没有更多元素时为nil,因此您不需要对其进行seq操作。 - Jeremy

1

获取向量中的项数,将其除以2,向下取整结果并获取该索引处的项。假设有一个向量v

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

很遗憾,floor不在clojure.core中,您需要引入另一个库或直接使用java.lang.Math.floor
当然,这段代码并没有处理偶数向量,但我假设您已经能够处理它们了。

在Clojure中,使用quot函数就不需要使用floor函数了,可以参考bereal的回答。 - georgek
这相当狡猾。这项业务的一半在于知道巨大库中有什么... - Matthew Walton
还可以看看bereals的答案,他指出你不需要使用“get”。 - noahlz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接