2013-08-29 2 views
-1

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

country_code = infer_country # will grab a user's two character country code 
region = 'us' # united states by default 
region_map = { 
     "au" => ["au"], # australia 
     "al" => ["al", "ba", "bg", "hr", "md", "me", "mk", "ro", "si"], # bulgaria and the balkans 
     "cn" => ["cn"], # china 
     "ee" => ["ee", "lt", "lv"], # estonia and the baltics 
     "fi" => ["fi"], # finland 
     "at" => ["at", "ch", "de"], # germany, austria, switzerland 
     "cy" => ["cy", "gr", "mt"], # greece, cyprus, malta 
     "hk" => ["hk"], # hong_kong 
     "id" => ["id"], # indonesia 
     "it" => ["it"], # italy 
     "jp" => ["jp"], # japan 
     "kp" => ["kp", "kr"], # korea 
     "ar" => ["ar", "bl", "bo", "br", "bz", "cl", "co", "cr", "cu", "do", "ec", "gf", "gp", "gt", "hn", 
       "ht", "mf", "mq", "mx", "ni", "pa", "pe", "pr", "py", "sv", "uy", "ve"], # latin america including brazil 
     "my" => ["my"], # malaysia 
     "af" => ["af", "eg", "iq", "ir", "sa", "ye", "sy", "il", "jo", "ps", "lb", "om", "kw", "qa", "bh"], # middle east 
     "nl" => ["nl"], # netherlands 
     "no" => ["no"], # norway 
     "pl" => ["pl"], # poland 
     "pt" => ["pt"], # portugal 
     "ph" => ["ph"], # philippines 
     "ru" => ["ru"], # russia 
     "rs" => ["rs"], # serbia 
     "sg" => ["sg"], # singapore 
     "za" => ["za"], # south africa 
     "bn" => ["bn", "bu", "kh", "la", "tl", "vn"], # south east asia 
     "es" => ["es"], # spain 
     "tw" => ["tw"], # taiwan 
     "th" => ["th"], # thailand 
     "tr" => ["tr"], # turkey 
     "gb" => ["gb" ] # united kingdom 
    }.invert 
# version 0.0 
region_map.each do |key, value| 
    if key.include? country_code 
    region = value 
    break 
    end 
end 

puts region 

Если country_code является "gb", то "gb" должен быть распечатан. Если country_code находится на юго-востоке Азии, скажем, это "vn", то "bn" следует распечатать.

Как я могу изящно решить эту проблему? При необходимости я могу реструктурировать хэш.

+2

Построить обратный хэш. Тогда поиск такой же тривиальный, как может быть. –

+1

И, пожалуйста, используйте '% w (at ch de)' вместо '[" at "," ch "," de "]' – Stefan

ответ

2
def find_region(country_code) 
    pair = @region_map.find{|k, v| v.include?(country_code)} 
    pair && pair.first 
end 

find_region('gb') # => "gb" 
find_region('bz') # => "ar" 
find_region('lv') # => "ee" 
find_region('ls') # => nil 
+0

nice, и если бы я хотел, чтобы он возвращал «нас» по умолчанию? (также, обновил мой ответ с версией 0.0, но конвертировал в вашу версию, поскольку это намного лучше). ладно, я думаю, что у меня это есть, спасибо! –

+0

Значение по умолчанию будет вашим домашним заданием :) –

+0

Вы можете указать значение по умолчанию, если вы используете шаблон конструктора 'Hash.new': http://www.ruby-doc.org/core-2.0/Hash.html#method- c-new – jxpx777

0
region_map = Hash.new("us").merge(
    "au" => "au", 
    "al" => "al", 
    "ba" => "al", 
    "bg" => "al", 
    "hr" => "al", 
    "md" => "al", 
    "me" => "al", 
    "mk" => "al", 
    "ro" => "al", 
    "si" => "al", 
    "al" => "al", 
    "cn" => "cn", 
    ... 
) 

region_map["non existing code"] # => "us" 
region_map[nil] # => "us" 
region_map["au"] # => "au" 
region_map["ba"] # => "al" 
region_map["cn"] # => "cn" 

или

def region_map code 
    case code 
    when "au" 
    "au" 
    when "al", "ba", "bg", "hr", "md", "me", "mk", "ro", "si" 
    "al" 
    when "cn" 
    "cn" 
    when "ee", "lt", "lv" 
    "ee" 
    ... 
    else 
    "us" 
    end 
end 

region_map("non existing code") # => "us" 
region_map(nil) # => "us" 
region_map("au") # => "au" 
region_map("ba") # => "al" 
region_map("cn") # => "cn" 
2
def find_region(country_code) 
    @region_map.each {|k,v| return k if v.include? country_code} 
    nil 
end 
+0

изменить «nil» на «us», и я думаю, что это лучший ответ, приятно! –

+0

fc: Лучше, methinks, чтобы def def__region (country_code = 'us') и включить 'us' в список. Нет смысла искать find_region ('sl') 'us'. ('sl' -> 'Shangra-La') –

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