2011-12-05 3 views
8

は、私は2つのベクトルを比較して、彼らが持っているアイテムは、アイテムが内にある同じ関係なくオーダーしているかどうかを確認したい項目の順序を比較してください。は関係なく、Clojureの内の2つのベクトル

..だから

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 

私はcontainsAを見つけることができませんでした以下のようなLLのJava

答えて

12

あなたは重複を気にしない場合は、両方のベクターからセットを作成し、これらを比較することができます:

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

機能として:

(defn set= [& vectors] (apply = (map set vectors))) 
4

でそれらからセットを作成します。

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 
8

重複を気にしない場合、他の回答は完全に適用可能で効率的です。 しかし、あなたはおそらく二つのベクトルを比較する最も簡単な方法は、ソートと比較され、重複を気にしない場合:

user=> (= (sort [3 5 2 2]) (sort [2 2 5 3])) 
true 
user=> (= (sort [3 5 2 2]) (sort [2 5 3])) 
false 
21

あなたが重複気を行う場合、あなたはその頻度マップを比較することができます。これらは、各コレクション要素をキーとし、出現回数を値として持つマップです。与えられた例のように、標準関数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))) 
2

あなたはすでにJVMにしているので、あなたがのcon​​tainsAllをしたい場合は、ちょうど、のcontainsAllを使うのか?

+1

'containsAll'は、あるコレクションが他のコレクションのサブセットであるかどうかを決定します。それは平等を決定しません。 – Confusion

+0

@Confusion 'a.containsAll(b)&& b.containsAll(a)'を使うことができます。 – bfontaine

1
(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 
+0

'(x false trueの場合)'を '(not x)'として単純化することができます。 – bfontaine