Сравните два вектора в порядке, независимо от порядка элементов - PullRequest
11 голосов
/ 05 декабря 2011

Я хочу сравнить два вектора и выяснить, одинаковые ли у них предметы, независимо от того, в каком порядке они находятся.

Итак ..

прямо сейчас в ближайшем будущем:

(= [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

Ответы [ 6 ]

26 голосов
/ 05 декабря 2011

Если вы заботитесь о дубликатах, вы можете сравнить их карты частот. Это карты с каждым элементом коллекции в качестве ключа и числом вхождений в качестве значения. Вы создаете их с помощью стандартной функции 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)))
16 голосов
/ 05 декабря 2011

Если вам не нужны дубликаты, вы можете создать наборы из обоих векторов и сравнить их:

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

Как функция:

(defn set= [& vectors] (apply = (map set vectors)))
10 голосов
/ 05 декабря 2011

Если вас не интересуют дубликаты, другие ответы вполне применимы и эффективны. Но если вы заботитесь о дубликатах, возможно, самый простой способ сравнить два вектора - это сортировка и сравнение:

user=> (= (sort [3 5 2 2]) (sort [2 2 5 3]))
true
user=> (= (sort [3 5 2 2]) (sort [2 5 3]))
false
5 голосов
/ 05 декабря 2011

Создание наборов из них:

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
3 голосов
/ 05 декабря 2011

Вы уже находитесь на JVM, поэтому, если вы хотите, чтобы в самом деле содержал AllAll, тогда просто используйте containsAll, верно?

1 голос
/ 11 сентября 2015
(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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...