2013-05-05 2 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."]

То, что я борюсь с то, как перебрать этот вектор и получить элементы, которые не являются текущим значением. Я пробовал с drop и remove, но не совсем понял.

Я думаю, что одна вещь, которую я мог бы сделать, это использовать first и rest в петле и conj предыдущее значение для выхода отдыха.

+0

Что вы подразумеваете под * пунктами, которые не являются текущим значением *? –

+0

Элементы в векторе, которые не являются «текущими» –

ответ

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

Это решение, которое я использую. Огромное спасибо! –

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

, изменены на '[prev [curr & foll]]' в строке 4 –

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

Вы могли бы рассмотреть возможность использования subvec или pop, потому что оба работают очень быстро на векторах.

Смежные вопросы