2016-02-26 87 views
1

我試圖減去另一個陣列同時頻率考慮的一個數組,像這樣:頻率減陣列

[1,2,2,2] some_code [1,2] # => [2,2] 

什麼是實現這一目標的最簡單的方法?

使用-去除第二數組中的元素的所有出現:

[1,2,2,2] - [1,2] # => [] 
+1

命令是否重要? – sawa

+1

你能告訴我你的代碼嗎? – psantos

+1

看到這個:http://stackoverflow.com/questions/3852755/ruby-array-subtraction-without-removing-items-more-than-once – psantos

回答

1
a1 = [1,2,2,2] 
a2 = [1,2]  
a2.each { |e| (idx = a1.find_index e) && (a1.delete_at idx) } 
#⇒ [2, 2] 

在這裏,我們遍歷所述第二陣列和從第一個刪除元素,每次迭代一次,如果那些被發現了。

第一個找到的元素將被刪除。

+0

將拋出錯誤。 – shivam

+0

@shivam的確,thx,固定的。 – mudasobwa

+1

非常好做!這確實改變了'a1',我認爲你不應該這樣做,因爲這個問題沒有明確地允許。明顯的解決方法僅僅是對'a1.dup'進行操作。 –

1
a = [1, 2, 2, 2] 
b = [1, 2] 

ha = a.each_with_object(Hash.new(0)){|e, h| h[e] += 1} 
# => {1=>1, 2=>3} 
hb = b.each_with_object(Hash.new(0)){|e, h| h[e] += 1} 
# => {1=>1, 2=>1} 
(ha.keys | hb.keys).flat_map{|k| Array.new([ha[k] - hb[k], 0].max, k)} 
# => [2, 2] 
+0

@CarySwoveland謝謝你指出。 – sawa

-2
def subtract arr_a, arr_b 
    arr_b.each do |b| 
    idx = arr_a.index(b) 
    arr_a.delete_at(idx) unless idx.nil? 
    end 
end 

輸出:

a = [1,2,2,2] 
b = [1,2] 
subtract a, b 
puts "a: #{a}" 
# => a: [2, 2] 
+0

不需要重複的答案。 – sawa

0

如果我理解正確的問題,你希望從陣列a刪除陣列b的每個元素的單次出現,這裏是做到這一點的一種方式:

a.keep_if {|i| !b.delete(i)} 
#=> [2,2] 

PS:兩個陣列ab由上面的代碼進行了變異,所以如果您想保留原始數組,您可能需要使用dup來創建副本。

+1

如果'a = [1,1]'和'b = [1,1]'我明白OP想要返回一個空數組(在'b'中爲每個'1'移除'a'中的'1') ,但'a.keep_if {| i | !b.delete(i)}#=> [1]'(因爲'delete(i)'刪除了'i'的所有實例)。 –

+0

謝謝@cary ...將在更新上工作。 –