我有一个像这样的哈希:
Some_hash =
{"Albania"=>"Europe",
"Andorra"=>"Europe",
"Austria"=>"Europe",
Lebanon"=>"Asia",
"Macau"=>"Asia",
"Malaysia"=>"Asia",
"Papua New Guinea"=>"Asia",
"Jamaica"=>"North America",
"Martinique"=>"North America",
"Argentina"=>"South America",
"Chile"=>"South America",
"Sao Tome and Principe"=>"Africa",
"Senegal"=>"Africa",
"Somalia"=>"Africa",}
我想分别识别五大洲以及属于这些大洲的国家,以便最终得出如下结果:
{"Africa" => ["Senegal", "Somalia"]}
{"Europe" => ["Albania", "Andorra", "Austria"]}
适用于所有大洲。
我尝试了这个:
def country
inflation_hash = {}
XPath.match( data, "//country").map do |element|
inflation_hash[element.attributes["name"]] = element.attributes["continent"]
end
inflation_hash.each do |country, continent|
new_hash = {}
if inflation_hash.has_value?("Africa") == true
new_hash["Africa"] = inflation_hash.keys
puts new_hash
end
end
end
而且效果很好。我得到一个新的哈希值:
{Africa => []}
但是我有两个问题:
我认为第一个问题与each
方法有关,所以我必须设置一些条件,对吗?
第二个问题,我不知道如何解决。
任何指针将不胜感激。
首先,你做了与不使用变量大写字母在Ruby中SomeHash
和XPath
。当变量名以大写字母开头时,表示它是一个常数,您可能不希望它是一个常数。
each
并非做到这一点的最佳方法,您可以使用以下命令更简单地做到这一点inject
:
countries = {
"Albania"=>"Europe",
"Andorra"=>"Europe",
"Austria"=>"Europe",
"Lebanon"=>"Asia",
"Macau"=>"Asia",
"Malaysia"=>"Asia",
"Papua New Guinea"=>"Asia",
"Jamaica"=>"North America",
"Martinique"=>"North America",
"Argentina"=>"South America",
"Chile"=>"South America",
"Sao Tome and Principe"=>"Africa",
"Senegal"=>"Africa",
"Somalia"=>"Africa"}
by_continents = countries.inject({}) do |memo, (k,v)|
memo[v] ||= []
memo[v] << k
memo
end
输出为:
{"Europe"=>["Albania", "Andorra", "Austria"], "Asia"=>["Lebanon", "Macau", "Malaysia", "Papua New Guinea"], "North America"=>["Jamaica", "Martinique"], "South America"=>["Argentina", "Chile"], "Africa"=>["Sao Tome and Principe", "Senegal", "Somalia"]}
您具有按大陆分组的所有国家,您可以选择其中任何一个。
在您的代码中应将其放置如下:
def country
inflation_hash = {}
XPath.match( data, "//country").map do |element|
inflation_hash[element.attributes["name"]] = element.attributes["continent"]
end
by_continents = inflation_hash.inject({}) do |memo, (k,v)|
memo[v] ||= []
memo[v] << k
memo
end
puts by_continents.inspect
by_continents
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句