2013-03-25 47 views
4

简单的新手问题...从矢量寻找“中间元素”用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"]
+2

当偶数个元素时它应该返回什么? – Jeremy 2013-03-25 14:37:16

+0

@Jeremy Heiler - 永远不会发生,所以我不担心它 – monch1962 2013-03-25 19:41:14

回答

7

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

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

你可以使用'(quot(count vect)2)' – Ankur 2013-03-25 12:14:31

+0

@Ankur谢谢,修正! – bereal 2013-03-25 12:15:55

1

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

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

可惜floorclojure.core,你需要在另一个库拉为或直接去java.lang.Math.floor

这段代码当然不会对偶数向量做任何事情,但我假设你已经可以处理它们了。

+0

看到贝瑞尔的答案,用clojure.core你不需要发言。 – georgek 2013-03-25 14:45:20

+0

这很狡猾。这一业务的一半是知道什么是在巨大的图书馆... – 2013-03-25 14:58:30

+0

也见bereals答案,你不需要'获得' – noahlz 2013-03-26 04:15:55

5

一个有点低效,但有趣的实现(可与序列的抽象,而不是具体的载体):

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

返回nil即使量元素的情况下。

乐趣却少了,但更高效:

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

其中v是向量。

+0

当没有更多的元素时,解构将会是“零”,所以你不需要“seq”它。 – Jeremy 2013-03-25 15:08:12

+1

s/quote/quot /? – Alex 2013-03-25 15:22:47

+0

是的,错字...... – 2013-03-25 16:11:27