2014-11-14 2 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

Дайте нам вход хэш образца и ожидаемый результат, пожалуйста. –

ответ

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

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

Мое чтение вопроса совпадает с @ theTinMan's, но это не очень понятно. –

+0

Да, ОП вызывал # каждого по значению. Трудно сказать. –

Смежные вопросы