2013-05-05 90 views
0

我試圖建立一套函數來比較句子到另一個。所以我寫了一個名爲split-to-sentences函數,它像這樣的輸入:給定一個clojure向量,迭代刪除1個元素

"This is a sentence. And so is this. And this one too."

和回報:

["This is a sentence" "And so is this" "And this one too."]

什麼我掙扎是如何遍歷這個向量,並得到不是當前值的項目。我試着用dropremove來嘮叨,但還沒有弄明白。

我想我可以做的一件事是在循環中使用firstrest,以及conj以前的值輸出休息。

+0

你是指什麼*不是當前值*的項目? – 2013-05-05 06:00:33

+0

向量中不是「current」 – 2013-05-05 07:21:47

回答

2
(remove #{current-value} sentences-vector) 
+0

這是我正在使用的解決方案。非常感謝! – 2013-05-06 02:51:32

2

只需使用過濾器:

(filter #(not= current-value %) sentences-vector) 
0

的竅門是通過兩次的句子變成reduce功能...

(def sentences ["abcd" "efg" "hijk" "lmnop" "qrs" "tuv" "wx" "y&z"]) 

(reduce 
    (fn [[prev [curr & foll]] _] 
    (let [aren't-current-value (concat prev foll)] 
     (println aren't-current-value) ;use it here 
     [(conj prev curr) foll])) 
    [[] sentences] 
    sentences) 

......一次,來看看下面的,而一旦迭代。

+0

的元素在第4行中更改爲[[prev [curr&foll]]' – 2013-05-05 11:17:51

0

我相信你可能想是這樣的功能:

(defn without-each [x] 
    (map (fn [i] (concat (subvec x 0 i) (subvec x (inc i)))) 
     (range (count x)))) 

使用方法如下:

>>> (def x ["foo" "bar" "baz"]) 
>>> (without-each x) 
==> (("bar" "baz") ("foo" "baz") ("foo" "bar")) 

返回的元素連接起來懶洋洋的,這就是爲什麼他們都沒有載體。這是可取的,因爲真向量級聯(例如(進入b))是O(n)。

因爲subvec使用與原始序列共享,所以不應該使用過量的內存。

0

,因爲這兩個載體上非常迅速操作您可以考慮使用subvecpop

相關問題