2013-10-12 69 views
0

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

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

我想利用每个值的键。所以阿富汗人会去阿富汗。然后我想要得到相同的散列。

我已经使用这个尝试:

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

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

+1

这不是一个散列,它是一个数组数组。你的循环遍历'countries'是可行的,因为Ruby每次都传入两个子元素,但这并不能算作散列。尝试输入'countries.class',你会看到它是什么。 –

+1

您应该获取带有大写/小写国家名称的列表,而不是转换它们。 – Stefan

回答

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提到的那样,像Éclair这样的国家甚至没有问题。但是,如果你有一个尖锐的字符(例如)在字中间大写,capitalize不处理这些事情,并且还有更多工作要做。

+0

不完全正确。进入'irb'和'éclair'.capitalize',你可能会看到一些问题。 –

+0

“ÉCLAIR”。资本化构成绝对没有问题,原因很明显,并且是我认为你想说明的例子@ muistooshort。如果'急e'在词的中间被大写,那么你将有一个问题需要解决。给答案添加了一个注释。 – vgoff

+0

是的,不好的例子,但重点是'capitalize'不知道任何关于非ASCII字符。更糟糕的是,大写字母取决于语言环境(例如,德语中的'SS'是'ß',希腊语中的'μ'是'M',...)。顺便说一句,''美国萨摩亚'应该是'美属萨摩亚'。 –

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" 
# } 
+0

'éclair'.capitalize'做了什么? –