プログラム中でハッシュを定義する

以下のようにするとプログラム中でハッシュを定義することができます。

 h = {"apple"=>150, "banana"=>300, "lemon"=>300}

キーに関連付けられた値を取得する

キーに関連づけられた値を取得するにはHash#[]メソッドまたは、Hash#fetchメソッドを使用します。

指定したキーが存在しない場合、Hash#[]メソッドはHash#defaultメソッドで定義された値が返却されます。生成時にはnilが設定されています。

Hash#fetchメソッドの場合、第2引数でデフォルト値を与えることができます。

また、fetchメソッドに対してブロックを指定するとキーが存在しない場合、そのブロックを評価した値を返します。デフォルト値、ブロックが指定されずにキーが存在しなければ例外が発生します。

 h = {"apple"=>150, "banana"=>300, "lemon"=>300}
 
 p h['apple'] #=> 150
 p h['banana'] #=> 200
 p h['lemon'] #=> 300
 p h['papaia'] #=> nil
 
 p h.fetch('apple') #=> 150
 p h.fetch('papaia', 500) #=> 500
 p h.fetch('papaia') { 500 } #=> 500
 p h.fetch('papaia') #=> IndexError

ハッシュに要素を追加する

以下のようにするとハッシュへ要素を追加することができます。

 h = Hash::new
 
 h['apple'] = 150
 h['banana'] = 200
 h['lemon'] = 300
 
 p h['apple'] #=> 150

Hash::newメソッドではなく前に示した{}による定義の後でも同様に追加することができます。

 h = {"apple"=>150, "banana"=>300, "lemon"=>300}
 
 h['papia'] = 500

Hash#storeメソッドを使っても同様にハッシュへ要素を追加することができます。

 h = Hash.new
 
 h.store('apple',150)
 h.store('banana', 200)
 h.store('lemon', 300)

ハッシュ内にキーが存在するかどうか調べる

Hash#key?メソッド、Hash#has_key?メソッド、Hash#include?メソッド、Hash#member?メソッドによりハッシュ内にキーが存在するかどうか調べることができます。それぞれのメソッドはキーが存在すれば真を返します。

 h = {"apple"=>150, "banana"=>300, "lemon"=>300}
 
 p h.key?('apple') #=> true
 p h.has_key?('orange') #=> false
 p h.include?('lemon') #=> true
 p h.member?('avocado') #=> false

ハッシュの要素数を取得する

Hash#lengthメソッドまたはHash#sizeメソッドでハッシュの要素数を取得することが出来ます。

 h = {"apple"=>150, "banana"=>300, "lemon"=>300}
 
 p h.length #=> 3
 p h.size #=> 3

キーが存在しない場合のデフォルト値を設定する

Hash#defaultメソッドによりハッシュにキーが存在しない場合のデフォルト値を設定する事ができます。

 h = {"apple"=>150, "banana"=>300, "lemon"=>300}
 h.default = 100
 
 p h['apple'] #=> 150
 p h['papaia'] #=> 100

また次のようにして, 任意のキーについて空の配列を値とするハッシュ hash を生成できます。

 hash = Hash.new{|h,k| h[k]=[]}

ハッシュからエントリを削除する

Hash#deleteメソッドによりキーに対応するエントリを削除することができます。Hash#deleteメソッドはレシーバ自身を更新します。

 h = {"apple"=>150, "banana"=>300, "lemon"=>500}
 
 h.delete('banana') #=> 300
 p h #=> {"apple"=>150, "lemon"=>500}

Hash#deleteメソッドにブロックを渡すと、指定されたキーが存在しなかった場合に評価されます。

 h = {"apple"=>150, "banana"=>300}
 
 h.delete('lemon') {|key| puts "#{key} not exist!"} #=> "lemon not exist!"

Hash#delete_ifメソッド、Hash#reject!メソッドはキーと値を引数としてブロックを評価し、値が真である時に要素を削除します。それぞれレシーバ自身を更新します。

 h = {"apple"=>150, "banana"=>300, "lemon"=>400}
 
 h.delete_if {|key, value| value < 200} #=> {"banana"=>300, "lemon"=>400}
 p h #=>  {"banana"=>300, "lemon"=>400}
 
 h.reject! {|key, value| key == "banana"} #=> {"lemon"=>400}
 p h #=> {"lemon"=>400}

ハッシュの全エントリに対してブロックを実行する

ハッシュの全エントリに対してキーを引数としてブロックを実行するにはHash#each_keyメソッド、値を引数として実行するにはHash#each_valueメソッド、キーと値を引数として実行するにはHash#eachメソッドまたはHash#each_pairメソッドを使用します。

 h = {"apple"=>150, "banana"=>300, "lemon"=>300}
 
 sum = 0
 fruits = []
 
 h.each_key {|key| fruits.concat([key])}
 p fruits #=> ["apple", "banana", "lemon"]
 
 h.each_value {|value| sum += value}
 p sum #=> 750
 
 h.each_pair {|key, value| puts "#{key}: \\#{value}"} 
 #=> "banana: \300"
 #=> "apple: \150"
 #=> "lemon: \300"

ハッシュを配列に変換する

Hash#keysメソッドにより全てのキーを配列に変換することができます。

 h = {"apple"=>150, "banana"=>300, "lemon"=>300}
 
 p h.keys #=> ["apple", "banana", "lemon"]

Hash#valuesメソッドにより全ての値を配列に変換することができます。

 h = {"apple"=>150, "banana"=>300, "lemon"=>300}
 
 p h.values #=> [150, 300, 300]

Hash#to_aメソッドによりキーと値のペアを配列の配列に変換することができます。

 h = {"apple"=>150, "banana"=>300, "lemon"=>300}
 
 p h.to_a #=> [["apple", 150], ["banana", 300], ["lemon", 300]]

Hash#indexesメソッドまたはHash#indicesメソッドにより指定されたキーを持つ要素の値を配列に変換することができます。

 h = {"apple"=>150, "banana"=>300, "lemon"=>500}
 
 p h.indexes("apple", "lemon") #=> [150, 500]
 p h.indices("banana", "lemon")  #=> [300, 500]

ハッシュを空にする

Hash#clearメソッドによりハッシュの要素を空にすることができます。Hash#clearメソッドはレシーバ自身の値を更新します。

 h = {"apple"=>150, "banana"=>300, "lemon"=>300}
 
 h.clear
 
 p h #=> {}

ハッシュを値で降順、値が等しい場合キーで昇順にソートする

Hash#to_aメソッドによりハッシュを[[key, value], [key, value],…]の二重配列化、その後Array#sortでソート

 h = {"ada" => 1, "hoge" => 4, "basha" => 3, "poeni"=>3}
 h.to_a.sort{|a, b|
   (b[1] <=> a[1]) * 2 + (a[0] <=> b[0])
 } #=>[["hoge", 4], ["basha", 3], ["poeni", 3], ["ada", 1]]

ハッシュの要素をランダムに抽出する

ハッシュを配列に変換してからランダムに決定したインデックスを取りだします.Hashクラスにchoiceメソッドを追加することで,簡単にハッシュの持つ要素をランダムに一つだけ取り出すことができます。

 if RUBY_VERSION < '1.9.0'
   class Array
     def choice
       at( rand( size ) )
     end
   end
   class Hash
     def choice
       keys.choice
     end
   end
 end

実行するたびに取り出される要素が異なります。

 h = {"apple"=>150, "banana"=>300, "lemon"=>300}
 h.choice #=> "apple"
 h.choice #=> "lemon"
 h.choice #=> "apple"

複数のハッシュをマージする

 h = {:k1=>:v1, :k2=>:v2}
 h.merge {:k2=>:modified, :k3=>:v3} #=> {:k1=>:v1, :k2=>:modified, :k3=>:v3}

merge は merge後のハッシュを返すのみで、破壊的メソッド merge! は h 自体を変更します。

また、merge! は update の別名でもあります。 上記例でもわかるように、キーが重複した場合、追加指定した値で優先的に上書きされます。