Ruby - 列表减去

时间:2011-08-25 10:34:51

标签: ruby arrays

我有两个清单

a = [1, 2, 3, 4, 1, 2]
b = a.uniq # b = [1, 2, 3, 4]

c = a - b

结果获得c = []

我希望结果为c = [1, 2]

我怎么能得到这个?

5 个答案:

答案 0 :(得分:5)

这是根据Array documentation的预期结果。

如果你想获得在数组中有多次出现的值,你可以这样:

a.uniq.keep_if {|v| a.count(v) > 1}

如果使用Ruby 1.8,则keep_if不可用,因此您需要使用以下内容:

a.uniq.delete_if {|v| a.count(v) == 1}

(两种方法都保持a完整无缺)

答案 1 :(得分:2)

如果您想从多次出现的数组中获取元素,可以使用以下代码:

a.delete_if { |x| a.count(x) <= 1 }.uniq

如果要根据元素位置对两个数组执行子操作,可以使用以下代码:

i = 0
a.drop_while { |x| b[i+=1] == x }.uniq

答案 2 :(得分:1)

来自documentation

  

数组差异 - 返回一个新数组,该数组是原始数组的副本,删除也出现在other_ary中的所有项。 (如果您需要类似集合的行为,请参阅库类Set。)

答案 3 :(得分:0)

您正在寻找所有重复或与uniq相反的副本?也许这个链接会有所帮助:Identify duplicates in an array

答案 4 :(得分:0)

看起来您正在尝试查找具有重复项的元素。这有几种方法,选择你喜欢的方式:

a.select { |x| a.count(x) > 1 }.uniq
a.sort.each_cons(2).map { |x,y| x if x == y }.compact
a.group_by{|x|x}.values.select{|k|k.size>1}.map(&:first)