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"]
答案 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
。
当然,这段代码对偶数计数向量没有任何作用,但我假设你已经可以处理它们了。