在Ruby中比较数组并删除重复项?

4

什么是比较多个数组并删除重复项的最简单方法?

所以(在这种情况下,是嵌套数组)...

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

这只是一个差集或者减法操作, 你可以这样写。操作符重载可能会让人愉悦 :)

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]]

比我的方法更优雅 - jigfox

1

将所有数组放在一个大数组中:

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接受参数。
编辑:这是Anurag的想法,应用于inject:
a.inject([]) do |acc, pairs|
  acc << (pairs - (acc.inject(&:+) || []))
end

这样怎么才能返回b1想要的结果? - jigfox
例如,通过将结果分配给a,b,c,d。你和Anurag都针对刚好有四个数组的情况给出了答案。我只是推广了答案,我认为这样更实用。 - Mladen Jablanović

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接