2013-03-25 46 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