2011-08-25 83 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)