Ruby中的规范Array差异示例是:
[ 1,1,2,3,4,5 ] - [ 1,4 ] #=> [ 3,5 ]
什么是最好的方式来获得以下行为?
[ 1,5 ].subtract_once([ 1,4 ]) #=> [ 1,5 ]
也就是说,只有第二个数组中每个匹配项的第一个实例从第一个数组中移除.
解决方法
减去值在其他数组中显示的次数,或任何
Enumerable:
class Array # Subtract each passed value once: # %w(1 2 3 1).subtract_once %w(1 1 2) # => ["2","3"] # Time complexity of O(n + m) def subtract_once(values) counts = values.inject(Hash.new(0)) { |h,v| h[v] += 1; h } reject { |e| counts[e] -= 1 unless counts[e].zero? } end
减去每个唯一值一次:
require 'set' class Array # Subtract each unique value once: # %w(1 2 2).subtract_once_uniq %w(1 2 2) # => [2] # Time complexity of O((n + m) * log m) def subtract_once_uniq(values) # note that set is implemented values_set = Set.new values.to_a reject { |e| values_set.delete(e) if values_set.include?(e) } end end