Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较clojure中的两个向量,无论项目的顺序如何_Clojure - Fatal编程技术网

比较clojure中的两个向量,无论项目的顺序如何

比较clojure中的两个向量,无论项目的顺序如何,clojure,Clojure,我想比较两个向量,找出它们的项目是否相同,无论项目的顺序如何 所以 现在在clojure: (= [1 2 3] [3 2 1]) ;=> false 我想: (other_fun [1 2 3] [3 2 1]) ;=> true (other_fun [1 2 3 4] [3 2 1]) ;=> false 我在java中找不到与之类似的containsAll从它们创建集合: user=> (= (set [1 2 3]) (set [3 2 1])) true

我想比较两个向量,找出它们的项目是否相同,无论项目的顺序如何

所以

现在在clojure:

(= [1 2 3] [3 2 1]) ;=> false
我想:

(other_fun [1 2 3] [3 2 1]) ;=> true

(other_fun [1 2 3 4] [3 2 1]) ;=> false
我在java中找不到与之类似的containsAll

从它们创建集合:

user=> (= (set [1 2 3]) (set [3 2 1]))
true


user=> (defn other_func [col1 col2]
        (= (set col1) (set col2)))
#'user/other_func
user=> (other_func [1 2 3] [3 2 1])
true

如果您不关心重复项,则可以从两个向量创建集并比较它们:

(= (set [1 2 3]) (set [3 2 1])) ;=> true
作为一项功能:

(defn set= [& vectors] (apply = (map set vectors)))
(defn other_fun [& colls]
  (apply = (map frequencies colls)))

如果你不在乎重复的问题,其他答案是完全适用和有效的。 但如果您确实关心重复,比较两个向量的最简单方法可能是排序和比较:

user=> (= (sort [3 5 2 2]) (sort [2 2 5 3]))
true
user=> (= (sort [3 5 2 2]) (sort [2 5 3]))
false
如果您确实关心重复项,则可以比较它们的频率图。这些是以每个集合元素为键、出现次数为值的映射。您可以使用标准函数
频率
创建它们,如给定示例中所示

不同的顺序,相同数量的副本:

(=(频率[1 2 3 4])(频率[4 1 1 2 3]))

计算
true

不同的顺序,不同的副本数量:

(=(频率[1 2 3 4])(频率[4 1 2 3]))

计算
false

因此,您可以编写一个函数:

(defn set= [& vectors] (apply = (map set vectors)))
(defn other_fun [& colls]
  (apply = (map frequencies colls)))

您已经在JVM上,因此如果您想要containsAll,那么只需使用containsAll,对吗?

containsAll
确定一个集合是否是另一个集合的子集。它不确定集合的相等性。@混乱您可以使用
a.containsAll(b)&&b.containsAll(a)
。您可以将
(如果x为假)
简化为
(不是x)
。也适用于地图!由于Clojure等式是按值计算的,
=
确实适用于更复杂的结构,如映射。这是一个多么有用的语言设计决策:将生产力置于性能之上。如有必要,您仍然可以使用指针进行比较。
(defn other_fun
  "checkes the presence of the elements of vec1 in vec2 and vice versa"
  [vec1 vec2]
  (if (or (some nil?
             (for [a vec1 b [vec2]]  (some #(= % a) b)))
       (some nil?
             (for [a vec2 b [vec1]]  (some #(= % a) b))))
    false
    true))

(other_fun [1 2 3] [3 2 1]) ;=> true

(other_fun [1 2 3 4] [3 2 1]) ;=> false