2011-08-25 72 views
2

我有两个列表红宝石 - 列表零下

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

c = a - b 

结果被c = []

我预计结果c = [1, 2]

我怎样才能得到呢?

回答

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

+0

keep_if不是ruby 2.0及以上版本 – owade

1

documentation

阵列差异,返回一个新数组,它是原始数组的一个副本,删除也出现在other_ary任何项目。 (如果您需要设置类似的行为,看到库班设置。)

2

如果你想从它出现的数组元素不止一次,你可以使用下面的代码:

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

如果要基于元素的两个数组执行副操作位置你可以用下面的代码:

i = 0 
a.drop_while { |x| b[i+=1] == x }.uniq 
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)