我正在尝试计算与哈希中的正则表达式模式匹配的唯一值的出现次数。
如果有三个不同的值,多次,我想知道每个值出现了多少。
这是到目前为止我为实现该目的而开发的代码:
def trim(results)
open = []
results.map { |k, v| v }.each { |n| open << n.to_s.scan(/^closed/) }
puts open.size
end
由于某种原因,它返回所有值的长度,而不仅仅是我尝试匹配的值。我也尝试使用results.each_value
,但无济于事。
另一种方式:
hash = {a: 'foo', b: 'bar', c: 'baz', d: 'foo'}
hash.each_with_object(Hash.new(0)) {|(k,v),h| h[v]+=1 if v.start_with?('foo')}
#=> {"foo"=>2}
或
hash.each_with_object(Hash.new(0)) {|(k,v),h| h[v]+=1 if v =~ /^foo|bar/}
#=> {"foo"=>2, "bar"=>1}
这样的事情?
hash = {a: 'foo', b: 'bar', c: 'baz', d: 'foo'}
groups = hash.group_by{ |k, v| v[/(?:foo|bar)/] }
# => {"foo"=>[[:a, "foo"], [:d, "foo"]],
# "bar"=>[[:b, "bar"]],
# nil=>[[:c, "baz"]]}
注意,有一个nil
键,这意味着该正则表达式不匹配任何内容。我们可以摆脱它,因为我们(可能)不在乎。或者,也许您确实关心,在这种情况下,请不要摆脱它。
groups.delete(nil)
这计算匹配的“匹配数”:
groups.map{ |k, v| [k, v.size] }
# => [["foo", 2], ["bar", 1]]
[group_by
是一种神奇的方法,非常值得学习。
group_by
对您有用吗?
我认为值得为引入 def count(hash, pattern)
hash.each_with_object({}) do |(k, v), counts|
counts[k] = v.count{|s| s.to_s =~ pattern}
end
end
h = { a: ['open', 'closed'], b: ['closed'] }
count(h, /^closed/)
=> {:a=>1, :b=>1}
的RUBY_VERSION #=> "2.7.0"
更新:
Enumerable#tally