2011-12-05 31 views

Trả lời

12

Nếu bạn không quan tâm đến bản sao, bạn có thể tạo bộ từ cả hai vectơ và so sánh các:

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

Là một chức năng :

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

Tạo bộ từ họ:

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

Nếu bạn không quan tâm đến bản sao, các câu trả lời khác hoàn toàn có thể áp dụng và hiệu quả. Nhưng nếu bạn quan tâm đến bản sao, có lẽ là cách dễ nhất để so sánh hai vectơ được phân loại và so sánh:

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

Nếu bạn làm chăm sóc về bản sao, bạn có thể so sánh bản đồ tần số của họ. Đây là các bản đồ với mỗi phần tử sưu tập dưới dạng khóa và số lần xuất hiện dưới dạng giá trị. Bạn tạo chúng bằng cách sử dụng hàm chuẩn frequencies, như trong ví dụ đã cho.

trật tự khác nhau, cùng một số các bản sao:

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

đánh giá true.

trật tự khác nhau, số lượng khác nhau của các bản sao:

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

đánh giá false.

Vì vậy, bạn có thể viết một hàm:

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

Bạn đang ở trên JVM đã có, vì vậy nếu bạn muốn containsAll, sau đó chỉ cần sử dụng containsAll, phải không?

+1

'containsAll' xác định liệu một bộ sưu tập có phải là tập hợp con của bộ sưu tập khác không. Nó không xác định thiết lập bình đẳng. – Confusion

+0

@Confusion Bạn có thể sử dụng '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

Bạn có thể đơn giản hóa '(nếu x false true)' thành '(not x)'. – bfontaine