我试图减去另一个阵列同时频率考虑的一个数组,像这样:频率减阵列
[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