我试图从考虑频率的另一个数组中减去一个数组,如下所示:
[1,2,2,2] some_code [1,2] # => [2,2]
最简单的方法是什么?
使用-
删除第二个数组中出现的所有元素:
[1,2,2,2] - [1,2] # => []
答案 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:上述代码对数组a
和b
都进行了更改,因此如果要保留原始数组,可能需要使用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]