我試圖減去另一個陣列同時頻率考慮的一個數組,像這樣:頻率減陣列
[1,2,2,2] some_code [1,2] # => [2,2]
什麼是實現這一目標的最簡單的方法?
使用-
去除第二數組中的元素的所有出現:
[1,2,2,2] - [1,2] # => []
我試圖減去另一個陣列同時頻率考慮的一個數組,像這樣:頻率減陣列
[1,2,2,2] some_code [1,2] # => [2,2]
什麼是實現這一目標的最簡單的方法?
使用-
去除第二數組中的元素的所有出現:
[1,2,2,2] - [1,2] # => []
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]
@CarySwoveland謝謝你指出。 – sawa
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]
不需要重複的答案。 – sawa
如果我理解正確的問題,你希望從陣列a
刪除陣列b
的每個元素的單次出現,這裏是做到這一點的一種方式:
a.keep_if {|i| !b.delete(i)}
#=> [2,2]
PS:兩個陣列a
和b
由上面的代碼進行了變異,所以如果您想保留原始數組,您可能需要使用dup
來創建副本。
如果'a = [1,1]'和'b = [1,1]'我明白OP想要返回一個空數組(在'b'中爲每個'1'移除'a'中的'1') ,但'a.keep_if {| i | !b.delete(i)}#=> [1]'(因爲'delete(i)'刪除了'i'的所有實例)。 –
謝謝@cary ...將在更新上工作。 –
命令是否重要? – sawa
你能告訴我你的代碼嗎? – psantos
看到這個:http://stackoverflow.com/questions/3852755/ruby-array-subtraction-without-removing-items-more-than-once – psantos