0

我有一个看起来像这样的长哈希(这只是其中的一部分):

countries =
  [
    ['AFGHANISTAN','AF'],
    ['ÅLAND ISLANDS','AX'],
    ['ALBANIA','AL'],
    ['ALGERIA','DZ'],
    ['AMERICAN SAMOA','AS']
  ]

我想大写每个值的键。所以阿富汗会去阿富汗。然后我想得到相同的哈希值。

我试过用这个:

countries.each do |key, value|
  puts key.capitalize
end

但它只给了我钥匙。我想将大写的键放回哈希中。我怎样才能做到这一点?

4

3 回答 3

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"
# }
于 2013-10-12T19:47:04.153 回答
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(当然是数组的,但也是每个字符串的)不会改变,它会改变它到位。

正如@muistooshort 所提到的,对于埃克莱尔国家这样的国家来说甚至没有问题。但是,如果你有一个在单词中间大写的尖锐字符(例如),capitalize不处理这些事情,还有更多工作要做。

于 2013-10-12T20:06:42.130 回答
0

#each不修改可枚举,它只是迭代它。您想使用#injecthttp://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] ) }
于 2013-10-12T19:39:23.737 回答