Сравните массивы и удалите дубликаты, в Ruby? - PullRequest
4 голосов
/ 29 июля 2010

Какой самый простой способ сравнить несколько массивов и удалить дубликаты?

Итак (массивы внутри массивов в данном случае) ...

a = [[2, 1], [3, 3], [7, 2], [5, 6]]  
b = [[2, 1], [6, 7], [9, 9], [4, 3]]  
c = [[2, 1], [1, 1], [2, 2], [9, 9]]  
d = [[2, 1], [9, 9], [2, 2], [3, 1]]  

... выйдет (с приоритетом для массива a, затем b, затем c, затем d)

a = [[2, 1], [3, 3], [7, 2], [5, 6]]  
b = [[6, 7], [9, 9], [4, 3]]  
c = [[1, 1], [2, 2]]  
d = [[3, 1]]  

Ответы [ 2 ]

14 голосов
/ 29 июля 2010

Это просто установить разницу или вычитание, и вы можете записать это так.Перегрузка оператора может быть блаженством:)

a - вот что это такое.

a
[[2, 1], [3, 3], [7, 2], [5, 6]]

b = b - a
[[6, 7], [9, 9], [4, 3]]

c = c - b - a # or c - (a + b)
[[1, 1], [2, 2]]

d = d - c - b - a # or d - (a + b + c)
[[3, 1]]
1 голос
/ 29 июля 2010

Наличие всех массивов в одном большом массиве:

a = [[[2, 1], [3, 3], [7, 2], [5, 6]],
[[2, 1], [6, 7], [9, 9], [4, 3]],
[[2, 1], [1, 1], [2, 2], [9, 9]],
[[2, 1], [9, 9], [2, 2], [3, 1]]]

Вы можете достичь того, что хотите, вот так:

a.inject([]) do |acc, pairs|
  acc << pairs.uniq.reject{|pair| acc.flatten(1).member?(pair)}
end

Примечание: я не уверен, с какой версии Ruby Array#flatten начал принимать аргументы.

Редактировать: вот идея Анурага, примененная для инъекции:

a.inject([]) do |acc, pairs|
  acc << (pairs - (acc.inject(&:+) || []))
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...