rubyのハッシュについて①
ハッシュとは「{ }」で囲んで、キーと値の組をカンマで区切って使います。
ハッシュの生成方法
a = {:hoge => 1 ,:fuga => 2} #=> {:hoge=>1, :fuga=>2} b = {hoge: 1, fuga: 2} #=> {:hoge=>1, :fuga=>2} c = Hash.new #=> {} d = Hash.new(3) #=> {} d[:foo] #=> 3 e = Hash[:hoge,1, :fuga,2] #=> {:hoge=>1, :fuga=>2}
ハッシュから配列を作る
rubyでは配列からハッシュを作ることが可能です。
⓵keysメソッドでキーを配列にする
h = {"soccer"=>1, "baseball"=>2, "tennis"=>3} p h.keys #=> ["soccer", "baseball", "tennis"]
②valuesメソッドで値を配列にする
h = {"soccer"=>1, "baseball"=>2, "tennis"=>3} p h.values #=> [1, 2, 3]
③values_atメソッドで指定したキーに対応する値を配列で返す
h = {"soccer"=>1, "baseball"=>2, "tennis"=>3} p h.values_at("soccer") #=> [1] p h.values_at("soccer","tennis") #=> [1, 3] p h.values_at("apple") #=> [nil] #対応するキーがないとnilが返る p h.values_at("apple","tennis") #=> [nil, 3]
④fetchメソッドで指定したキーに対する値を返す(配列ではない)。キーが存在しなければ例外が発生するが、第2引数があればその値をデフォルトとして返します。
h = {"soccer"=>1, "baseball"=>2, "tennis"=>3} p h.fetch("soccer") #=> 1 p h.fetch("apple",nil) #=>nil #"apple"に対応する値がないので、引数のnilが返る。もし第2引数がなければエラーになる p h.fetch("tennis",nil) #=> 3 #tennisは3に対応するので第2引数は無視される p h.fetch("soccer","tennis") #=> 1 #第1引数に対応した値のみ返す
⑤to_aメソッドでキー、値ともに配列にする
h = {"soccer"=>1, "baseball"=>2, "tennis"=>3} p h.to_a #=> [["soccer", 1], ["baseball", 2], ["tennis", 3]] p h.to_a.flatten #=> ["soccer", 1, "baseball", 2, "tennis", 3] #flattenメソッドは配列を平坦化するメソッド
配列からハッシュを作る
①to_hメソッドを使う
a = [["foo", 10], ["bar", 20], ["hoge", 30]] p a.to_h #=> {"foo"=>10, "bar"=>20, "hoge"=>30} #["foo", 10], ["bar", 20], ["hoge", 30].to_hはキーと値の組み合わせがないのでエラーになる
②Hashメソッドを使う
Hash[0, "A", 1, "B", 2, "C"] #=> {0=>"A", 1=>"B", 2=>"C"}
③zipメソッドとto_hメソッドを組み合わせて使う
a = [1,2,3] ,b = ["a","b","c"]とあって、ハッシュ{1=>"a", 2=>"b", 3=>"c"}を作りたい時 arr = a.zip(b) #=> [[1, "a"], [2, "b"], [3, "c"]] p arr.to_h #=> {1=>"a", 2=>"b", 3=>"c"} とすればできる。(zipメソッドは配列同士を組み合わせるメソッド)