0

我正在尝试构建一组函数来相互比较句子。所以我写了一个函数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但还没有完全弄清楚。

我想我可以做的一件事是在循环中使用firstand并将前一个值用于 rest 的输出。restconj

4

5 回答 5

2

只需使用过滤器:

(filter #(not= current-value %) sentences-vector)
于 2013-05-05T07:00:16.447 回答
2
(remove #{current-value} sentences-vector)
于 2013-05-05T07:23:25.733 回答
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)

...一次查看以下内容,一次进行迭代。

于 2013-05-05T07:14:01.133 回答
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"))

返回的元素是惰性连接的,这就是它们不是向量的原因。这是可取的,因为真正的向量连接(例如(到 ab))是 O(n)。

因为 subvec 使用与原始序列共享,所以不应该使用过多的内存。

于 2013-05-05T07:16:50.407 回答
0

您可能会考虑使用subvecorpop因为两者都在向量上运行得非常快。

于 2014-03-14T15:08:37.103 回答