给定一个clojure向量,迭代删除1个元素

时间:2013-05-05 05:57:25

标签: clojure

我正在尝试构建一组函数来比较句子。所以我写了一个名为split-to-sentences的函数,它接受这样的输入:

"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之前的值用于休息输出。

5 个答案:

答案 0 :(得分:2)

只需使用过滤器:

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

答案 1 :(得分:2)

(remove #{current-value} sentences-vector)

答案 2 :(得分: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)

...一次看到以下的,一次迭代。

答案 3 :(得分: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使用与原始序列共享,所以不应使用过多的内存。

答案 4 :(得分:0)

您可以考虑使用subvecpop,因为两者都可以在矢量上快速运行。