加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 20:47:03 所属栏目:百科 来源:网络整理
导读:Ruby中的规范Array差异示例是: [ 1,1,2,3,4,5 ] - [ 1,4 ] #= [ 3,5 ] 什么是最好的方式来获得以下行为? [ 1,5 ].subtract_once([ 1,4 ]) #= [ 1,5 ] 也就是说,只有第二个数组中每个匹配项的第一个实例从第一个数组中移除. 解决方法 减去值在其他数组中显
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读