Vector 向向量和集合添加值

Vector 向向量和集合添加值,vector,clojure,set,append,Vector,Clojure,Set,Append,以下是我所拥有的: (def my-atom (atom [])) (defn add-to-my-atom! [x] (swap! my-atom conj x)) 如何仅在向量不存在时才将值附加到向量?我希望能够使用谓词进行测试。例如,在Common Lisp中有: Clojure中有类似的东西吗?也许,我应该使用集合而不是向量。好的如何定义集合用于比较其值的谓词?例如,集合可以包含字符串,并且假设大小写的差异不应影响集合上的操作,Clojure是如何处理的?如果您没有使用原子,则添

以下是我所拥有的:

(def my-atom (atom []))

(defn add-to-my-atom! [x]
  (swap! my-atom conj x))
如何仅在向量不存在时才将值附加到向量?我希望能够使用谓词进行测试。例如,在Common Lisp中有:


Clojure中有类似的东西吗?也许,我应该使用集合而不是向量。好的如何定义集合用于比较其值的谓词?例如,集合可以包含字符串,并且假设大小写的差异不应影响集合上的操作,Clojure是如何处理的?

如果您没有使用原子,则添加到向量(如果不存在)的fn将是:

(defn push-new [v value]
   (if (some #{value} v)
       v
       (conj v value)))
现在,您可以轻松地使用该fn从原子的一个值移动到下一个值:

(defn add-to-my-atom [the-atom x]
   (swap! the-atom push-new x))

根据您的用例,集合可能更合适。Clojure依赖于放入集合的对象的equals和hashcode实现,除非您使用排序集by,或者您可以在将它们放入集合之前简单地将它们大写。

如果您没有使用原子,则添加到向量(如果不存在)的fn将是:

(defn push-new [v value]
   (if (some #{value} v)
       v
       (conj v value)))
现在,您可以轻松地使用该fn从原子的一个值移动到下一个值:

(defn add-to-my-atom [the-atom x]
   (swap! the-atom push-new x))
根据您的用例,集合可能更合适。Clojure依赖于放入集合的对象的equals和hashcode实现,除非您使用排序集by,或者您可以在将它们放入集合之前简单地将它们大写。

使用向量:

user> (def my-atom (atom []))

(defn push-new
  [place item pred]
  (if (pred place item)
    (conj place item)
    place))

(defn add-to-my-atom!
  [x]
  (swap! my-atom push-new x
         (fn [place item]
           (not (some #(= (.toLowerCase %)
                          (.toLowerCase item))
                      place)))))


#'user/add-to-my-atom!
user> (add-to-my-atom! "Hello World!")
["Hello World!"]
user> (add-to-my-atom! "hello world!")
["Hello World!"]
user> (add-to-my-atom! "ABCDE")
["Hello World!" "ABCDE"]
user> (add-to-my-atom! "abcde")
["Hello World!" "ABCDE"]
使用带有自定义排序比较器的集合:

user> (def my-atom (atom (sorted-set-by (fn [a b] (compare (.toLowerCase a) (.toLowerCase b))))))
#'user/my-atom
user> (swap! my-atom conj "Hello")
#{"Hello"}
user> (swap! my-atom conj "hello")
#{"Hello"}
user> (swap! my-atom conj "abc")
#{"abc" "Hello"}
user> (swap! my-atom conj "Abc")
#{"abc" "Hello"}
使用向量:

user> (def my-atom (atom []))

(defn push-new
  [place item pred]
  (if (pred place item)
    (conj place item)
    place))

(defn add-to-my-atom!
  [x]
  (swap! my-atom push-new x
         (fn [place item]
           (not (some #(= (.toLowerCase %)
                          (.toLowerCase item))
                      place)))))


#'user/add-to-my-atom!
user> (add-to-my-atom! "Hello World!")
["Hello World!"]
user> (add-to-my-atom! "hello world!")
["Hello World!"]
user> (add-to-my-atom! "ABCDE")
["Hello World!" "ABCDE"]
user> (add-to-my-atom! "abcde")
["Hello World!" "ABCDE"]
使用带有自定义排序比较器的集合:

user> (def my-atom (atom (sorted-set-by (fn [a b] (compare (.toLowerCase a) (.toLowerCase b))))))
#'user/my-atom
user> (swap! my-atom conj "Hello")
#{"Hello"}
user> (swap! my-atom conj "hello")
#{"Hello"}
user> (swap! my-atom conj "abc")
#{"abc" "Hello"}
user> (swap! my-atom conj "Abc")
#{"abc" "Hello"}

好的,谢谢你,我实际上也可以写这样的东西,我正在寻找一个标准的,已经实施的解决方案,以避免重新发明轮子。无论如何,谢谢。注意编辑-这实际上是
排序集按
设计的(如果排序在这里至少不重要)。不,排序不重要,我的示例在这里简化了,但实际上它类似于单词词典。在这种情况下
排序集按
具有对数时间查找的优势,与使用
some
进行线性时间检查不同,谢谢,我实际上也可以编写类似的内容,我正在寻找一个标准的、已经实现的解决方案,以避免重新发明轮子。无论如何,谢谢。注意编辑-这实际上是
排序集按
设计的(如果排序在这里至少不重要)。不,排序不重要,我的示例在这里简化了,但实际上它类似于单词词典。在这种情况下
排序集按
具有对数时间查找的优势,与使用
some
进行线性时间检查相反,如果您使用排序集By,则不需要依赖equals和hashcode。谢谢如果使用排序集,则不需要依赖equals和hashcode。谢谢