2012-09-27 3 views
12

У меня есть массив хешированной в Ruby, который выглядит следующим образом:Подсчет хеш-значения в Рубине

domains = [ 
    { "country" => "Germany"}, 
    {"country" => "United Kingdom"}, 
    {"country" => "Hungary"}, 
    {"country" => "United States"}, 
    {"country" => "France"}, 
    {"country" => "Germany"}, 
    {"country" => "Slovakia"}, 
    {"country" => "Hungary"}, 
    {"country" => "United States"}, 
    {"country" => "Norway"}, 
    {"country" => "Germany"}, 
    {"country" => "United Kingdom"}, 
    {"country" => "Hungary"}, 
    {"country" => "United States"}, 
    {"country" => "Norway"} 
] 

Из этого массива хэшей я хочу, чтобы создать новый хеш выглядит примерно так:

counted = { 
    "Germany" => "3", 
    "United Kingdom" => "United Kingdom", 
    "Hungary" => "3", 
    "United States" => "4", 
    "France" => "1" 
} 

Есть ли простой способ сделать это с помощью Ruby 1.9?

+3

этот хэш сталкиваясь ключи. – Kyle

+6

Этот хэш не будет выглядеть так, как вы хотите. В хэше может быть только одна запись с заданным ключом, поэтому у вас будет только одна запись (я думаю, гарантированно будет «страна» => «Норвегия». Хотите получить ответ для массива? – Chowlett

+1

Рядом проблема с вашим хешем источника. Ожидаете ли вы «Соединенное Королевство» => «Соединенное Королевство» или «Великобритания» => 2'? – knut

ответ

10

Как насчет этого?

counted = Hash.new(0) 
domains.each { |h| counted[h["country"]] += 1 } 
counted = Hash[counted.map {|k,v| [k,v.to_s] }] 
+1

Отлично! - Ты спасатель жизни. Я провел годы, пытаясь заставить это работать! Спасибо! – user1513388

5
domains.each_with_object(Hash.new{|h,k|h[k]='0'}) do |h,res| 
    res[h['country']].succ! 
end 
=> {"Germany"=>"3", 
"United Kingdom"=>"2", 
"Hungary"=>"3", 
"United States"=>"3", 
"France"=>"1", 
"Slovakia"=>"1", 
"Norway"=>"2"} 
+0

Что происходит, когда существует более 9 экземпляров страны? :) –

+2

'9'.sucC# =>' 10 ' – megas

+1

Спасибо, я этого не ожидал. :) Я должен был прочитать инструкцию перед комментированием. –

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