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

Fed*_*ico 11 clojure

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

所以..

现在在clojure:

(= [1 2 3] [3 2 1]) ;=> false
Run Code Online (Sandbox Code Playgroud)

我想要:

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

(other_fun [1 2 3 4] [3 2 1]) ;=> false
Run Code Online (Sandbox Code Playgroud)

我找不到java中的containsAll

Gor*_*vic 26

如果您关心重复项,则可以比较它们的频率图.这些是将每个集合元素作为键和出现次数作为值的映射.您可以使用标准函数创建它们frequencies,就像给出的示例一样.

不同的顺序,相同数量的重复:

(= (frequencies [1 1 2 3 4])(frequencies [4 1 1 2 3]))

评估true.

不同的顺序,不同数量的重复:

(= (frequencies [1 1 2 3 4])(frequencies [4 1 2 3]))

评估false.

所以,你可以编写一个函数:

(defn other_fun [& colls]
  (apply = (map frequencies colls)))
Run Code Online (Sandbox Code Playgroud)


Chr*_*erg 17

如果你不关心重复,你可以从两个向量创建集合并比较这些:

(= (set [1 2 3]) (set [3 2 1])) ;=> true
Run Code Online (Sandbox Code Playgroud)

作为一个功能:

(defn set= [& vectors] (apply = (map set vectors)))
Run Code Online (Sandbox Code Playgroud)


Vla*_*eev 10

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

user=> (= (sort [3 5 2 2]) (sort [2 2 5 3]))
true
user=> (= (sort [3 5 2 2]) (sort [2 5 3]))
false
Run Code Online (Sandbox Code Playgroud)


sin*_*nan 5

从中创建集合:

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
Run Code Online (Sandbox Code Playgroud)