アウトプットの部屋

エンジニアになるためのアウトプット

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メソッドは配列同士を組み合わせるメソッド)