2016-02-26 82 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 ...将在更新上工作。 –