Ruby - 合并两个数组并删除重复值

51

我有两个数组

a = [1, 2, 3, 4, 5]

b = [2, 4, 6]

我想要合并这两个数组,然后移除与另一个数组相同的值。结果应为:

c = [1, 3, 5, 6]
我尝试过将两个数组做减法,结果是[1, 3, 5]。我还想获取第二个数组中与第一个数组不重复的值。

我已经尝试过将两个数组相减,结果为[1, 3, 5]。同时我也想从第二个数组中获取那些在第一个数组中没有重复的值。


11
a + b - (a & b) - Dmitry
谢谢,比我想象的简单多了。非常感谢你!! - user3204760
3
(a-b)+(b-a) 的翻译是:(a-b)+(b-a) - Cary Swoveland
7个回答

48

使用 Array#uniq 方法。

a = [1, 3, 5, 6]
b = [2, 3, 4, 5]

c = (a + b).uniq
=> [1, 3, 5, 6, 2, 4]

4
我想合并这两个数组,然后删除与另一个数组相同的值。这是问题陈述...你的解决方案在这种情况下不起作用。 - Abhinay
2
@Abhinay 这个解决方案是正确的。它只是一个不同的方法。除非它有更差的性能,否则它比被接受的答案更明显。 - wuliwong
1
@wuliwong 如果他们要找的结果是 [1, 3, 5, 6],而这不是这个代码的结果,那么这怎么正确呢? - riley
1
@wuliwong 这不是一种不同的方法,而是解决了一个不同的问题,这不是 OP 所要求的。删除重复项和删除重复值是不同的事情。将 [1,2,2,3] 转换为 [1,2,3] 不等同于 [1,3]。第一个是删除重复项,第二个是删除重复值。 - Peter R

46

使用|

a = [1, 2, 3, 4, 5]
b = [2, 4, 6]
合并时不重复数值。
a | b 
# => [1, 2, 3, 4, 5, 6]

获取仅重复的值

a & b
# => [2, 4]

合并并移除重复值,也就是获取所有唯一值并减去所有重复值。

(a | b) - (a & b)
# => [1, 3, 5, 6]

Ruby文档


3
这就是那一个。 - Joshua Pinter
@JoshuaPinter 这怎么行?它是错的。OP要求删除重复的值,而不是删除重复项。答案应该是 [1,3,5,6] 而不是 [1,2,3,4,5,6] - Peter R
好的,我已经编辑过了,以获取两种行为。 - noraj
@PeterR 哈哈,你说得对!原帖是要求删除“所有”重复项。我只是想保留任何重复项中的1个,所以这对我有用。感谢您为其他人指出这一点。 - Joshua Pinter

42

你可以做以下几点!

# Merging
c = a + b
 => [1, 2, 3, 4, 5, 2, 4, 6]
# Removing the value of other array
# (a & b) is getting the common element from these two arrays
c - (a & b)
=> [1, 3, 5, 6]

尽管我是独立想出这个想法的,但 Dmitri 的评论也与我的相同。


感谢您的回答和解释! - user3204760
2
你应该引用 @Dmitry 早先的评论,因为它构成了你回答的基础(即使你是独立想出来的)。 - Cary Swoveland
优雅!这就是为什么我更喜欢 Ruby。 - Igbanam

24

4

让我们有两个数组

p = [1, 2, 5, 4, 8, 9]
q = [5, 6, 4, 8, 5, 3]

(p+q).uniq or (p.concat(q)).uniq

=> [1, 2, 5, 4, 8, 9, 6, 3]

同时 p|q 也可以胜任!选择适合你的那个。

根据上述要求,

(p | q) - (p & q) 可以完成任务。


这是错误的。OP要求删除重复的值,而不是删除重复项。答案应该是[1,3,5,6]而不是[1,2,3,4,5,6] - Peter R
在这种情况下,(p | q) - (p & q)(p+q) - (p & q) 都可以使用! - V K Singh

0
很明显,如果你有一个包含多个数组的数组,想要将它们合并在一起,可以这样做: [[1, 2], [2], [3]].sum.uniq => [1, 2, 3]

-1

试试看 Set.new([1,2,3]+[1,4,5])? 它会返回 [1,2,3,4,5]


[1,2,3,4,5] 不是正确的结果,[2,3,4,5] 才是。 - Peter R

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