用频率减去数组

时间:2016-02-26 17:00:09

标签: arrays ruby

我试图从考虑频率的另一个数组中减去一个数组,如下所示:

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

最简单的方法是什么?

使用-删除第二个数组中出现的所有元素:

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

4 个答案:

答案 0 :(得分:1)

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

这里我们迭代第二个数组并从第一个数组中删除元素,每次迭代一次,如果找到那些元素。

第一个找到的元素将被删除。

答案 1 :(得分: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]

答案 2 :(得分:0)

如果我正确理解了问题,您希望从数组b中删除数组a的每个元素的单个匹配项,这是执行此操作的一种方法:

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

PS:上述代码对数组ab都进行了更改,因此如果要保留原始数组,可能需要使用dup来创建副本。

答案 3 :(得分:-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]