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列挙可能なものを変更するのではなく、それを反復するだけです。使いたい#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] ) }
于 2013-10-12T19:39:23.737 に答える