2014-11-14 140 views
0

我正在計算與散列中的正則表達式模式匹配的唯一值的出現次數。計算散列中值的唯一出現次數

如果有三個不同的值,多​​次,我想知道每個值發生多少。

這是我開發的實現,到目前爲止,代碼:

def trim(results) 
    open = [] 

    results.map { |k, v| v }.each { |n| open << n.to_s.scan(/^closed/) } 
    puts open.size 
end 

出於某種原因,它返回所有的值,不只是我試圖在比賽的那些的長度。我也試過使用results.each_value,無濟於事。

+1

給我們一個樣本輸入哈希和預期輸出請。 – 2014-11-14 22:54:19

回答

1

另一種方式:

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} 
+0

這正是我正在尋找的,謝謝。感謝大家的回答。 – user3408678 2014-11-15 21:10:47

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是一個神奇的方法和良好值得我們學習的。

1
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} 

這是否適合您?

+0

我對這個問題的閱讀與@TinMan's一致,但不是很清楚。 – 2014-11-15 00:19:25

+0

是的,OP正在調用#each的價值。很難說。 – 2014-11-15 13:06:08