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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。