我有一个看起来像这样的长哈希(这只是它的一部分):
countries =
[
['AFGHANISTAN','AF'],
['ÅLAND ISLANDS','AX'],
['ALBANIA','AL'],
['ALGERIA','DZ'],
['AMERICAN SAMOA','AS']
]
我想大写每个值的键。所以阿富汗人会去阿富汗。然后我想得到相同的哈希值。
我尝试过使用它:
countries.each do |key, value|
puts key.capitalize
end
但它只给了我钥匙。我想把大写的键放回哈希。我怎么能这样做?
答案 0 :(得分:2)
代码不会修改哈希值。它只打印大写键。
您应删除旧条目并添加新条目。或者按照以下方式创建新哈希:
countries = Hash[[
['AFGHANISTAN','AF'],
['ÅLAND ISLANDS','AX'],
['ALBANIA','AL'],
['ALGERIA','DZ'],
['AMERICAN SAMOA','AS']
]]
countries = Hash[countries.map {|country, abbr| [country.capitalize, abbr] }]
# => {
# "Afghanistan"=>"AF",
# "Åland islands"=>"AX",
# "Albania"=>"AL",
# "Algeria"=>"DZ",
# "American samoa"=>"AS"
# }
答案 1 :(得分:2)
你的“哈希”不是哈希,而是数组。
countries.each do |name, abbreviation|
temp = name.dup
name.clear
name << temp.split(' ').map(&:capitalize!).join(' ')
end
这会将每个名称更改为大写名称。
[
["Afghanistan", "AF"],
["Åland Islands", "AX"],
["Albania", "AL"],
["Algeria", "DZ"],
["American Samoa", "AS"]
]
这也解决了多个单词,并且因为你提到想要保持相同的“散列”,这保持相同的数组,object_id(当然,也是每个String的数组)不会改变,它会改变它。
正如@muistooshort提到的那样,像Éclair这样的国家甚至没有问题。但是,如果你有一个尖锐的角色(例如)在词的中间大写,capitalize
不会处理这些事情,还有更多的工作要做。
答案 2 :(得分:0)
#each
不修改可枚举,它只是迭代它。您想使用#inject
(http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-inject)
像:
countries.inject({}){|caps_hash,og_hash| caps_hash.merge(og_hash[0].capitalize => og_hash[1] ) }