Ruby数组减法不要多次删除项目

前端之家收集整理的这篇文章主要介绍了Ruby数组减法不要多次删除项目前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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

猜你在找的Ruby相关文章